General Setup


Create a new analysis directory...
source(paste0(PROJECT_loc, "/scripts/functions.R"))
source(paste0(PROJECT_loc, "/scripts/pack01.packages.R"))

* General packages...

Background

This notebook contains additional figures of the project “Plaque expression levels of HDAC9 in association with plaque vulnerability traits and secondary vascular events in patients undergoing carotid endarterectomy: an analysis in the Athero-EXPRESS Biobank.”.

Loading data

# load(paste0(PROJECT_loc, "/",Today,".",PROJECTNAME,".bulkRNAseq.main_analysis.RData"))
load(paste0(PROJECT_loc, "/20220319.",PROJECTNAME,".bulkRNAseq.main_analysis.RData"))
source("/Users/slaan3/git/CirculatoryHealth/AE_20211201_YAW_SWVANDERLAAN_HDAC9/scripts/local.system.R")

Create a new analysis directory...
Today = format(as.Date(as.POSIXlt(Sys.time())), "%Y%m%d")
Today.Report = format(as.Date(as.POSIXlt(Sys.time())), "%A, %B %d, %Y")

Fix some variables

We need to get the ‘conventional unit’ versions of cholesterols.

AERNASE.clin.hdac9 <- merge(AERNASE.clin.hdac9, 
                            subset(AEDB.CEA, select = c("STUDY_NUMBER", 
                                                        "risk614", 
                                                        "LDL_finalCU", "HDL_finalCU", "TC_finalCU", "TG_finalCU")), 
                            by.x = "STUDY_NUMBER", by.y = "STUDY_NUMBER", sort = TRUE, all.x = TRUE)

Fix counts

We limit the maximum count at 100.

# ?ggpubr::ggboxplot()
# compare_means(LRCH1 ~ eGFRGroup, data = AERNASE.clin %>% filter(!is.na(eGFRGroup)), method = "kruskal.test")
# ggpubr::ggboxplot(AERNASE.clin %>% filter(!is.na(eGFRGroup))

cat("Get summary statistics for target:\n")
Get summary statistics for target:
summary(AERNASE.clin.hdac9$HDAC9)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   0.00   11.00   21.00   28.32   37.00  449.00 
cat("\nCount number of values > 100 for target:\n")

Count number of values > 100 for target:
sum(AERNASE.clin.hdac9$HDAC9 > 100)
[1] 12
cat("\nSetting values > 100 for target to 100.\n")

Setting values > 100 for target to 100.
AERNASE.clin.hdac9 <- AERNASE.clin.hdac9 %>% mutate(HDAC9_max100 = ifelse(HDAC9 > 100, 100, HDAC9)) 

cat("Get summary statistics for target after fixing values:\n")
Get summary statistics for target after fixing values:
summary(AERNASE.clin.hdac9$HDAC9_max100)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   0.00   11.00   21.00   26.71   37.00  100.00 

Additional figures

Age and sex

We want to create per-age-group figures median ± interquartile range.

  • Box and Whisker plot for target(s) plaque levels by sex.
  • Box and Whisker plot for target(s) plaque levels by (sex and) age group (<55, 55-64, 65-74, 75-84, 85+).

# ?ggpubr::ggboxplot()
compare_means(HDAC9 ~ Gender,  data = AERNASE.clin.hdac9, method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9, 
                  x = c("Gender"),
                  y = "HDAC9", 
                  xlab = "gender",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.Gender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ Gender,  data = AERNASE.clin.hdac9, method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9, 
                  x = c("Gender"),
                  y = "HDAC9_max100", 
                  xlab = "gender",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.Gender.pdf"), plot = last_plot())
Saving 12 x 8 in image
library(dplyr)

AERNASE.clin.hdac9 <- AERNASE.clin.hdac9 %>% dplyr::mutate(AgeGroup = factor(case_when(Age < 55 ~ "<55",
                                                     Age >= 55  & Age <= 64 ~ "55-64",
                                                     Age >= 65  & Age <= 74 ~ "65-74",
                                                     Age >= 75  & Age <= 84 ~ "75-84",
                                                     Age >= 85 ~ "85+"))) 

AERNASE.clin.hdac9 <- AERNASE.clin.hdac9 %>% dplyr::mutate(AgeGroupSex = factor(case_when(Age < 55 & Gender == "male" ~ "<55 males" ,
                                                        Age >= 55  & Age <= 64 & Gender == "male"~ "55-64 males",
                                                        Age >= 65  & Age <= 74 & Gender == "male"~ "65-74 males",
                                                        Age >= 75  & Age <= 84 & Gender == "male"~ "75-84 males",
                                                        Age >= 85 & Gender == "male"~ "85+ males",
                                                        Age < 55 & Gender == "female" ~ "<55 females" ,
                                                        Age >= 55  & Age <= 64 & Gender == "female"~ "55-64 females ",
                                                        Age >= 65  & Age <= 74 & Gender == "female"~ "65-74 females",
                                                        Age >= 75  & Age <= 84 & Gender == "female"~ "75-84 females",
                                                        Age >= 85 & Gender == "female"~ "85+ females")))

table(AERNASE.clin.hdac9$AgeGroup, AERNASE.clin.hdac9$Gender)
       
        female male
  <55       11   27
  55-64     43  124
  65-74     58  191
  75-84     37  119
  85+        4    9
table(AERNASE.clin.hdac9$AgeGroupSex)

   <55 females      <55 males 55-64 females     55-64 males  65-74 females    65-74 males  75-84 females    75-84 males    85+ females 
            11             27             43            124             58            191             37            119              4 
     85+ males 
             9 

Now we can draw some graphs of plaque target(s) levels per sex and age group as median ± interquartile range.


# ?ggpubr::ggboxplot()
compare_means(HDAC9 ~ AgeGroup,  data = AERNASE.clin.hdac9, method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9, 
                  x = c("AgeGroup"),
                  y = "HDAC9", 
                  xlab = "Age groups (years)",
                  ylab = "HDAC9 (normalized expression)",
                  color = "AgeGroup",
                  palette = "npg",
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter")) +
  stat_compare_means(aes(group = AgeGroup), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.AgeGroup.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ AgeGroup, group.by = "Gender", data = AERNASE.clin.hdac9, method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9, 
                  x = c("AgeGroup"),
                  y = "HDAC9", 
                  xlab = "Age groups (years) per gender",
                  ylab = "HDAC9 (normalized expression",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter")) +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.AgeGroup_perGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
# ?ggpubr::ggboxplot()
compare_means(HDAC9_max100 ~ AgeGroup,  data = AERNASE.clin.hdac9, method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9, 
                  x = c("AgeGroup"),
                  y = "HDAC9_max100", 
                  xlab = "Age groups (years)",
                  ylab = "HDAC9 (normalized expression)",
                  color = "AgeGroup",
                  palette = "npg",
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter")) +
  stat_compare_means(aes(group = AgeGroup), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.AgeGroup.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ AgeGroup, group.by = "Gender", data = AERNASE.clin.hdac9, method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9, 
                  x = c("AgeGroup"),
                  y = "HDAC9_max100", 
                  xlab = "Age groups (years) per gender",
                  ylab = "HDAC9 (normalized expression",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter")) +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.AgeGroup_perGender.pdf"), plot = last_plot())
Saving 12 x 8 in image

Hypertension & blood pressure

We want to create figures of target(s) levels stratified by hypertension/blood pressure, and use of anti-hypertensive drugs.

  • Box and Whisker plot for target(s) plaque levels by hypertension group (no, yes)
  • Box and Whisker plot for target(s) plaque levels by systolic blood pressure group (<120, 120-139, 140-159,160+)
library(dplyr)

AERNASE.clin.hdac9 <- AERNASE.clin.hdac9 %>% mutate(SBPGroup = factor(case_when(systolic < 120 ~ "<120",
                                                     systolic >= 120  & systolic <= 139 ~ "120-139",
                                                     systolic >= 140  & systolic <= 159 ~ "140-159",
                                                     systolic >= 160 ~ "160+"))) 

table(AERNASE.clin.hdac9$SBPGroup, AERNASE.clin.hdac9$Gender)
         
          female male
  <120         7   22
  120-139     30   81
  140-159     36  120
  160+        62  169

Now we can draw some graphs of plaque target(s) levels per sex and hypertension/blood pressure group as median ± interquartile range.

compare_means(HDAC9 ~ SBPGroup, data = AERNASE.clin.hdac9 %>% filter(!is.na(SBPGroup)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(SBPGroup)), 
                  x = c("SBPGroup"),
                  y = "HDAC9", 
                  xlab = "Systolic blood pressure (mmHg)",
                  ylab = "HDAC9 (normalized expression)",
                  color = "SBPGroup",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(aes(group = SBPGroup), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.SBPGroup.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ Hypertension.selfreport, data = AERNASE.clin.hdac9 %>% filter(!is.na(Hypertension.selfreport)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Hypertension.selfreport)), 
                  x = c("Hypertension.selfreport"),
                  y = "HDAC9", 
                  xlab = "Self-reported hypertension",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Hypertension.selfreport",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(aes(group = Hypertension.selfreport), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.Hypertension.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ Hypertension.drugs, data = AERNASE.clin.hdac9 %>% filter(!is.na(Hypertension.drugs)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Hypertension.drugs)), 
                  x = c("Hypertension.drugs"),
                  y = "HDAC9", 
                  xlab = "Hypertension medication use",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Hypertension.drugs",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(aes(group = Hypertension.drugs), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.HypertensionDrugs.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ SBPGroup, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(SBPGroup)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(SBPGroup)), 
                  x = c("SBPGroup"),
                  y = "HDAC9", 
                  xlab = "Systolic blood pressure (mmHg) per gender",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.SBPGroup_byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ Hypertension.selfreport, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(Hypertension.selfreport)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Hypertension.selfreport)), 
                  x = c("Hypertension.selfreport"),
                  y = "HDAC9", 
                  xlab = "Self-reported hypertension per gender",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.Hypertension_byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ Hypertension.drugs, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(Hypertension.drugs)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Hypertension.drugs)), 
                  x = c("Hypertension.drugs"),
                  y = "HDAC9", 
                  xlab = "Hypertension medication use per gender",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.Hypertension.drugs_byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ SBPGroup, group.by = "Hypertension.drugs", data = AERNASE.clin.hdac9 %>% filter(!is.na(SBPGroup) & !is.na(Hypertension.drugs)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(SBPGroup) & !is.na(Hypertension.drugs)), 
                  x = c("SBPGroup"),
                  y = "HDAC9", 
                  xlab = "Systolic blood pressure (mmHg) by medication use",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Hypertension.drugs",
                  palette = c("#49A01D", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Hypertension.drugs), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.SBPGroup_byHypertensionDrugs.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ Hypertension.selfreport, group.by = "Hypertension.drugs", data = AERNASE.clin.hdac9 %>% filter(!is.na(Hypertension.selfreport) & !is.na(Hypertension.drugs)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Hypertension.selfreport) & !is.na(Hypertension.drugs)), 
                  x = c("Hypertension.selfreport"),
                  y = "HDAC9", 
                  xlab = "Self-reported hypertension per medication use",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Hypertension.drugs",
                  palette = c("#49A01D", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Hypertension.drugs), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.Hypertension.selfreport_byHypertensionDrugs.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ SBPGroup, data = AERNASE.clin.hdac9 %>% filter(!is.na(SBPGroup)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(SBPGroup)), 
                  x = c("SBPGroup"),
                  y = "HDAC9_max100", 
                  xlab = "Systolic blood pressure (mmHg)",
                  ylab = "HDAC9 (normalized expression)",
                  color = "SBPGroup",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(aes(group = SBPGroup), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.SBPGroup.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ Hypertension.selfreport, data = AERNASE.clin.hdac9 %>% filter(!is.na(Hypertension.selfreport)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Hypertension.selfreport)), 
                  x = c("Hypertension.selfreport"),
                  y = "HDAC9_max100", 
                  xlab = "Self-reported hypertension",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Hypertension.selfreport",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(aes(group = Hypertension.selfreport), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.Hypertension.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ Hypertension.drugs, data = AERNASE.clin.hdac9 %>% filter(!is.na(Hypertension.drugs)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Hypertension.drugs)), 
                  x = c("Hypertension.drugs"),
                  y = "HDAC9_max100", 
                  xlab = "Hypertension medication use",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Hypertension.drugs",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(aes(group = Hypertension.drugs), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.HypertensionDrugs.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ SBPGroup, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(SBPGroup)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(SBPGroup)), 
                  x = c("SBPGroup"),
                  y = "HDAC9_max100", 
                  xlab = "Systolic blood pressure (mmHg) per gender",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.SBPGroup_byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ Hypertension.selfreport, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(Hypertension.selfreport)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Hypertension.selfreport)), 
                  x = c("Hypertension.selfreport"),
                  y = "HDAC9_max100", 
                  xlab = "Self-reported hypertension per gender",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.Hypertension_byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ Hypertension.drugs, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(Hypertension.drugs)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Hypertension.drugs)), 
                  x = c("Hypertension.drugs"),
                  y = "HDAC9_max100", 
                  xlab = "Hypertension medication use per gender",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.Hypertension.drugs_byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ SBPGroup, group.by = "Hypertension.drugs", data = AERNASE.clin.hdac9 %>% filter(!is.na(SBPGroup) & !is.na(Hypertension.drugs)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(SBPGroup) & !is.na(Hypertension.drugs)), 
                  x = c("SBPGroup"),
                  y = "HDAC9_max100", 
                  xlab = "Systolic blood pressure (mmHg) by medication use",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Hypertension.drugs",
                  palette = c("#49A01D", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Hypertension.drugs), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.SBPGroup_byHypertensionDrugs.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ Hypertension.selfreport, group.by = "Hypertension.drugs", data = AERNASE.clin.hdac9 %>% filter(!is.na(Hypertension.selfreport) & !is.na(Hypertension.drugs)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Hypertension.selfreport) & !is.na(Hypertension.drugs)), 
                  x = c("Hypertension.selfreport"),
                  y = "HDAC9_max100", 
                  xlab = "Self-reported hypertension per medication use",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Hypertension.drugs",
                  palette = c("#49A01D", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Hypertension.drugs), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.Hypertension.selfreport_byHypertensionDrugs.pdf"), plot = last_plot())
Saving 12 x 8 in image

Hypercholesterolemia & LDL levels

We want to create figures of target(s) levels stratified by hypercholesterolemia/LDL-levels, and use of lipid-lowering drugs.

  • Box and Whisker plot for target(s) plaque levels by hypercholesterolemia (risk614) group (no, yes)
  • Box and Whisker plot for target(s) plaque levels by lipid-lowering drugs group (no, yes)
  • Box and Whisker plot for target(s) plaque levels by LDL-levels (mmol/L) group (<100, 100-129, 130-159, 160-189, 190+)
library(dplyr)

AERNASE.clin.hdac9 <- AERNASE.clin.hdac9 %>% mutate(LDLGroup = factor(case_when(LDL_finalCU < 100 ~ "<100",
                                                     LDL_finalCU >= 100  & LDL_finalCU <= 129 ~ "100-129",
                                                     LDL_finalCU >= 130  & LDL_finalCU <= 159 ~ "130-159",
                                                     LDL_finalCU >= 160  & LDL_finalCU <= 189 ~ "160-189",
                                                     LDL_finalCU >= 190 ~ "190+"))) 


table(AERNASE.clin.hdac9$LDLGroup, AERNASE.clin.hdac9$Gender)
         
          female male
  <100        45  142
  100-129     25   73
  130-159     18   42
  160-189      9   21
  190+         2    9
require(sjlabelled)

AERNASE.clin.hdac9$risk614 <- to_factor(AERNASE.clin.hdac9$risk614)

# Fix plaquephenotypes
attach(AERNASE.clin.hdac9)
AERNASE.clin.hdac9[,"Hypercholesterolemia"] <- NA
# AERNASE.clin.hdac9$Hypercholesterolemia[risk614 == "missing value"] <- NA
# AERNASE.clin.hdac9$Hypercholesterolemia[risk614 == -999] <- NA
AERNASE.clin.hdac9$Hypercholesterolemia[risk614 == "no"] <- "no"
AERNASE.clin.hdac9$Hypercholesterolemia[risk614 == "yes"] <- "yes"
detach(AERNASE.clin.hdac9)

table(AERNASE.clin.hdac9$risk614, AERNASE.clin.hdac9$Hypercholesterolemia)
               
                 no yes
  missing value   0   0
  no            191   0
  yes             0 404
# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "risk614", "Hypercholesterolemia"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# rm(AEDB.temp)

Now we can draw some graphs of plaque target(s) levels per sex and hypercholesterolemia/LDL-levels group, as well as stratified by lipid-lowering drugs users as median ± interquartile range.


compare_means(HDAC9 ~ LDLGroup, data = AERNASE.clin.hdac9 %>% filter(!is.na(LDLGroup)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(LDLGroup)), 
                  x = c("LDLGroup"),
                  y = "HDAC9", 
                  xlab = "LDL (mg/dL) per gender",
                  ylab = "HDAC9 (normalized expression))",
                  color = "LDLGroup",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.LDLGroups.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ LDLGroup, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(LDLGroup)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(LDLGroup)), 
                  x = c("LDLGroup"),
                  y = "HDAC9", 
                  xlab = "LDL (mg/dL) per gender",
                  ylab = "HDAC9 (normalized expression))",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.LDLGroups_byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ Hypercholesterolemia, data = AERNASE.clin.hdac9 %>% filter(!is.na(Hypercholesterolemia)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Hypercholesterolemia)), 
                  x = c("Hypercholesterolemia"),
                  y = "HDAC9", 
                  xlab = "Diagnosed hypercholesterolemia",
                  ylab = "HDAC9 (normalized expression))",
                  color = "Hypercholesterolemia",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.Hypercholesterolemia.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ Hypercholesterolemia, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(Hypercholesterolemia)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Hypercholesterolemia)), 
                  x = c("Hypercholesterolemia"),
                  y = "HDAC9", 
                  xlab = "Diagnosed hypercholesterolemia per gender",
                  ylab = "HDAC9 (normalized expression))",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.Hypercholesterolemia_byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ Med.Statin.LLD, data = AERNASE.clin.hdac9 %>% filter(!is.na(Med.Statin.LLD)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Med.Statin.LLD)), 
                  x = c("Med.Statin.LLD"),
                  y = "HDAC9", 
                  xlab = "Lipid-lowering drug use",
                  ylab = "HDAC9 (normalized expression))",
                  color = "Med.Statin.LLD",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.Med.Statin.LLD.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ Med.Statin.LLD, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(Med.Statin.LLD)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Med.Statin.LLD)), 
                  x = c("Med.Statin.LLD"),
                  y = "HDAC9", 
                  xlab = "Lipid-lowering drug use per gender",
                  ylab = "HDAC9 (normalized expression))",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.Med.Statin.LLD_byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ LDLGroup, group.by = "Med.Statin.LLD", data = AERNASE.clin.hdac9 %>% filter(!is.na(LDLGroup) & !is.na(Med.Statin.LLD)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(LDLGroup) & !is.na(Med.Statin.LLD)), 
                  x = c("LDLGroup"),
                  y = "HDAC9", 
                  xlab = "LDL (mg/dL) per LLD use",
                  ylab = "HDAC9 (normalized expression))",
                  color = "Med.Statin.LLD",
                  palette = c("#49A01D", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Med.Statin.LLD), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.LDLGroups_byMed.Statin.LLD.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ Hypercholesterolemia, group.by = "Med.Statin.LLD", data = AERNASE.clin.hdac9 %>% filter(!is.na(Hypercholesterolemia) & !is.na(Med.Statin.LLD)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Hypercholesterolemia) & !is.na(Med.Statin.LLD)), 
                  x = c("Hypercholesterolemia"),
                  y = "HDAC9", 
                  xlab = "Diagnosed hypercholesterolemia per LLD use",
                  ylab = "HDAC9 (normalized expression))",
                  color = "Med.Statin.LLD",
                  palette = c("#49A01D", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Med.Statin.LLD), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.LDLGroups_byMed.Statin.LLD.pdf"), plot = last_plot())
Saving 12 x 8 in image

compare_means(HDAC9_max100 ~ LDLGroup, data = AERNASE.clin.hdac9 %>% filter(!is.na(LDLGroup)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(LDLGroup)), 
                  x = c("LDLGroup"),
                  y = "HDAC9_max100", 
                  xlab = "LDL (mg/dL) per gender",
                  ylab = "HDAC9 (normalized expression))",
                  color = "LDLGroup",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.LDLGroups.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ LDLGroup, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(LDLGroup)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(LDLGroup)), 
                  x = c("LDLGroup"),
                  y = "HDAC9_max100", 
                  xlab = "LDL (mg/dL) per gender",
                  ylab = "HDAC9 (normalized expression))",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.LDLGroups_byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ Hypercholesterolemia, data = AERNASE.clin.hdac9 %>% filter(!is.na(Hypercholesterolemia)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Hypercholesterolemia)), 
                  x = c("Hypercholesterolemia"),
                  y = "HDAC9_max100", 
                  xlab = "Diagnosed hypercholesterolemia",
                  ylab = "HDAC9 (normalized expression))",
                  color = "Hypercholesterolemia",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.Hypercholesterolemia.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ Hypercholesterolemia, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(Hypercholesterolemia)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Hypercholesterolemia)), 
                  x = c("Hypercholesterolemia"),
                  y = "HDAC9_max100", 
                  xlab = "Diagnosed hypercholesterolemia per gender",
                  ylab = "HDAC9 (normalized expression))",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.Hypercholesterolemia_byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ Med.Statin.LLD, data = AERNASE.clin.hdac9 %>% filter(!is.na(Med.Statin.LLD)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Med.Statin.LLD)), 
                  x = c("Med.Statin.LLD"),
                  y = "HDAC9_max100", 
                  xlab = "Lipid-lowering drug use",
                  ylab = "HDAC9 (normalized expression))",
                  color = "Med.Statin.LLD",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.Med.Statin.LLD.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ Med.Statin.LLD, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(Med.Statin.LLD)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Med.Statin.LLD)), 
                  x = c("Med.Statin.LLD"),
                  y = "HDAC9_max100", 
                  xlab = "Lipid-lowering drug use per gender",
                  ylab = "HDAC9 (normalized expression))",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.Med.Statin.LLD_byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ LDLGroup, group.by = "Med.Statin.LLD", data = AERNASE.clin.hdac9 %>% filter(!is.na(LDLGroup) & !is.na(Med.Statin.LLD)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(LDLGroup) & !is.na(Med.Statin.LLD)), 
                  x = c("LDLGroup"),
                  y = "HDAC9_max100", 
                  xlab = "LDL (mg/dL) per LLD use",
                  ylab = "HDAC9 (normalized expression))",
                  color = "Med.Statin.LLD",
                  palette = c("#49A01D", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Med.Statin.LLD), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.LDLGroups_byMed.Statin.LLD.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ Hypercholesterolemia, group.by = "Med.Statin.LLD", data = AERNASE.clin.hdac9 %>% filter(!is.na(Hypercholesterolemia) & !is.na(Med.Statin.LLD)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Hypercholesterolemia) & !is.na(Med.Statin.LLD)), 
                  x = c("Hypercholesterolemia"),
                  y = "HDAC9_max100", 
                  xlab = "Diagnosed hypercholesterolemia per LLD use",
                  ylab = "HDAC9 (normalized expression))",
                  color = "Med.Statin.LLD",
                  palette = c("#49A01D", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Med.Statin.LLD), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.LDLGroups_byMed.Statin.LLD.pdf"), plot = last_plot())
Saving 12 x 8 in image

Kidney function (eGFR)

We want to create figures of target(s) levels stratified by kidney function.

  • Box and Whisker plot for target(s) plaque levels by chronic kidney disease (CKD) group (1, 2, 3, 4, 5)
  • Box and Whisker plot for target(s) plaque levels by eGFR (MDRD-based) group (90+, 60-89, 30-59, <30)
library(dplyr)

AERNASE.clin.hdac9 <- AERNASE.clin.hdac9 %>% mutate(eGFRGroup = factor(case_when(GFR_MDRD < 15 ~ "<15",
                                                             GFR_MDRD >= 15  & GFR_MDRD <= 29 ~ "15-29",
                                                             GFR_MDRD >= 30  & GFR_MDRD <= 59 ~ "30-59",
                                                             GFR_MDRD >= 60  & GFR_MDRD <= 89 ~ "60-89",
                                                             GFR_MDRD >= 90 ~ "90+")))

table(AERNASE.clin.hdac9$eGFRGroup, AERNASE.clin.hdac9$Gender)
       
        female male
  15-29      2    6
  30-59     38  101
  60-89     84  249
  90+       25   86
table(AERNASE.clin.hdac9$eGFRGroup, AERNASE.clin.hdac9$KDOQI)
       
        No data available/missing Normal kidney function CKD 2 (Mild) CKD 3 (Moderate) CKD 4 (Severe) CKD 5 (Failure)
  15-29                         0                      0            0                0              8               0
  30-59                         0                      0            0              139              0               0
  60-89                         0                      0          333                0              0               0
  90+                           0                    111            0                0              0               0

Now we can draw some graphs of plaque target(s) levels per sex and kidney function group as median ± interquartile range.


# Global test

compare_means(HDAC9 ~ eGFRGroup, data = AERNASE.clin.hdac9 %>% filter(!is.na(eGFRGroup)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(eGFRGroup)), 
                  x = c("eGFRGroup"),
                  y = "HDAC9", 
                  xlab = "eGFR (mL/min per 1.73 m2)",
                  ylab = "HDAC9 (normalized expression)",
                  color = "eGFRGroup",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.EGFR.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ eGFRGroup, group.by = "Gender",  data = AERNASE.clin.hdac9 %>% filter(!is.na(eGFRGroup)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(eGFRGroup)), 
                  x = c("eGFRGroup"),
                  y = "HDAC9", 
                  xlab = "eGFR (mL/min per 1.73 m2) per gender",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.EGFR_byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ KDOQI, data = AERNASE.clin.hdac9 %>% filter(!is.na(KDOQI)), method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(KDOQI)), 
                  x = c("KDOQI"),
                  y = "HDAC9", 
                  xlab = "Kidney function (KDOQI)",
                  ylab = "HDAC9 (normalized expression)",
                  color = "KDOQI",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(aes(group = KDOQI), label = "p.format", method = "kruskal.test")
ggpar(p1 + rotate_x_text(45), legend = "right") 

rm(p1)
ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.KDOQI.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ KDOQI, group.by = "Gender",   data = AERNASE.clin.hdac9 %>% filter(!is.na(KDOQI)), method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(KDOQI)), 
                  x = c("KDOQI"),
                  y = "HDAC9", 
                  xlab = "Kidney function (KDOQI) per gender",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")
ggpar(p1 + rotate_x_text(45), legend = "right") 

rm(p1)
ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.KDOQI_byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ eGFRGroup,  data = AERNASE.clin.hdac9 %>% filter(!is.na(eGFRGroup) & !is.na(KDOQI)), method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(eGFRGroup) & !is.na(KDOQI)), 
                  x = c("eGFRGroup"),
                  y = "HDAC9", 
                  xlab = "eGFR (mL/min per 1.73 m2) by KDOQI group",
                  ylab = "HDAC9 (normalized expression)",
                  color = "KDOQI",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(method = "kruskal.test")
ggpar(p1, legend = "right")

rm(p1)
ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.EGFR_KDOQI.pdf"), plot = last_plot())
Saving 12 x 8 in image

# Global test

compare_means(HDAC9_max100 ~ eGFRGroup, data = AERNASE.clin.hdac9 %>% filter(!is.na(eGFRGroup)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(eGFRGroup)), 
                  x = c("eGFRGroup"),
                  y = "HDAC9_max100", 
                  xlab = "eGFR (mL/min per 1.73 m2)",
                  ylab = "HDAC9 (normalized expression)",
                  color = "eGFRGroup",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.EGFR.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ eGFRGroup, group.by = "Gender",  data = AERNASE.clin.hdac9 %>% filter(!is.na(eGFRGroup)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(eGFRGroup)), 
                  x = c("eGFRGroup"),
                  y = "HDAC9_max100", 
                  xlab = "eGFR (mL/min per 1.73 m2) per gender",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.EGFR_byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ KDOQI, data = AERNASE.clin.hdac9 %>% filter(!is.na(KDOQI)), method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(KDOQI)), 
                  x = c("KDOQI"),
                  y = "HDAC9_max100", 
                  xlab = "Kidney function (KDOQI)",
                  ylab = "HDAC9 (normalized expression)",
                  color = "KDOQI",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(aes(group = KDOQI), label = "p.format", method = "kruskal.test")
ggpar(p1 + rotate_x_text(45), legend = "right") 

rm(p1)
ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.KDOQI.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ KDOQI, group.by = "Gender",   data = AERNASE.clin.hdac9 %>% filter(!is.na(KDOQI)), method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(KDOQI)), 
                  x = c("KDOQI"),
                  y = "HDAC9_max100", 
                  xlab = "Kidney function (KDOQI) per gender",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")
ggpar(p1 + rotate_x_text(45), legend = "right") 

rm(p1)
ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.KDOQI_byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ eGFRGroup,  data = AERNASE.clin.hdac9 %>% filter(!is.na(eGFRGroup) & !is.na(KDOQI)), method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(eGFRGroup) & !is.na(KDOQI)), 
                  x = c("eGFRGroup"),
                  y = "HDAC9_max100", 
                  xlab = "eGFR (mL/min per 1.73 m2) by KDOQI group",
                  ylab = "HDAC9 (normalized expression)",
                  color = "KDOQI",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(method = "kruskal.test")
ggpar(p1, legend = "right")

rm(p1)
ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.EGFR_KDOQI.pdf"), plot = last_plot())
Saving 12 x 8 in image

BMI

We want to create figures of target(s) levels stratified by BMI.

  • Box and Whisker plot for target(s) plaque levels by BMI WHO group (underweight, normal, overweight, obese)
  • Box and Whisker plot for target(s) plaque levels by BMI group (<18.5, 18.5-24.9, 25, 29.9, 30-24.9, 35+)
library(dplyr)

AERNASE.clin.hdac9 <- AERNASE.clin.hdac9 %>% mutate(BMIGroup = factor(case_when(BMI < 18.5 ~ "<18.5",
                                                     BMI >= 18.5  & BMI < 25 ~ "18.5-24",
                                                     BMI >= 25  & BMI < 30 ~ "25-29",
                                                     BMI >= 30  & BMI < 35 ~ "30-35",
                                                     BMI >= 35 ~ "35+"))) 

# require(labelled)
# AERNASE.clin.hdac9$BMI_US <- as_factor(AERNASE.clin.hdac9$BMI_US)
# AERNASE.clin.hdac9$BMI_WHO <- as_factor(AERNASE.clin.hdac9$BMI_WHO)
# table(AERNASE.clin.hdac9$BMI_WHO, AERNASE.clin.hdac9$BMI_US)

table(AERNASE.clin.hdac9$BMIGroup, AERNASE.clin.hdac9$Gender)
         
          female male
  <18.5        3    2
  18.5-24     46  162
  25-29       68  220
  30-35       18   55
  35+          6   12
table(AERNASE.clin.hdac9$BMIGroup, AERNASE.clin.hdac9$BMI_WHO)
         
          No data available/missing Underweight Normal Overweight Obese
  <18.5                           0           5      0          0     0
  18.5-24                         0           0    208          0     0
  25-29                           0           0      0        287     0
  30-35                           0           0      0          0    73
  35+                             0           0      0          0    18

Now we can draw some graphs of plaque MCP1 levels per sex and age group as median ± interquartile range.


# Global test
compare_means(HDAC9 ~ BMIGroup,  data = AERNASE.clin.hdac9 %>% filter(!is.na(BMIGroup)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(BMIGroup)), 
                  x = c("BMIGroup"),
                  y = "HDAC9", 
                  xlab = "BMI groups (kg/m2)",
                  ylab = "HDAC9 (normalized expression)",
                  # color = "Gender",
                  # palette = c("#D5267B", "#1290D9"),
                  color = "BMIGroup",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.BMI.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ BMIGroup, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(BMIGroup)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(BMIGroup)), 
                  x = c("BMIGroup"),
                  y = "HDAC9", 
                  xlab = "BMI groups (kg/m2) per gender",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.BMI_byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ BMIGroup,  data = AERNASE.clin.hdac9 %>% filter(!is.na(BMIGroup) & !is.na(BMI_WHO)), method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(BMIGroup) & !is.na(BMI_WHO)), 
                  x = c("BMIGroup"),
                  y = "HDAC9", 
                  xlab = "BMI groups (kg/m2) per WHO categories",
                  ylab = "HDAC9 (normalized expression)",
                  color = "BMI_WHO",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(method = "kruskal.test")
ggpar(p1, legend = "right")

rm(p1)
ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.BMI_byWHO.pdf"), plot = last_plot())
Saving 12 x 8 in image

# Global test
compare_means(HDAC9_max100 ~ BMIGroup,  data = AERNASE.clin.hdac9 %>% filter(!is.na(BMIGroup)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(BMIGroup)), 
                  x = c("BMIGroup"),
                  y = "HDAC9_max100", 
                  xlab = "BMI groups (kg/m2)",
                  ylab = "HDAC9 (normalized expression)",
                  # color = "Gender",
                  # palette = c("#D5267B", "#1290D9"),
                  color = "BMIGroup",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.BMI.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ BMIGroup, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(BMIGroup)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(BMIGroup)), 
                  x = c("BMIGroup"),
                  y = "HDAC9_max100", 
                  xlab = "BMI groups (kg/m2) per gender",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.BMI_byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ BMIGroup,  data = AERNASE.clin.hdac9 %>% filter(!is.na(BMIGroup) & !is.na(BMI_WHO)), method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(BMIGroup) & !is.na(BMI_WHO)), 
                  x = c("BMIGroup"),
                  y = "HDAC9_max100", 
                  xlab = "BMI groups (kg/m2) per WHO categories",
                  ylab = "HDAC9 (normalized expression)",
                  color = "BMI_WHO",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(method = "kruskal.test")
ggpar(p1, legend = "right")

rm(p1)
ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.BMI_byWHO.pdf"), plot = last_plot())
Saving 12 x 8 in image

Diabetes

We want to create figures of target(s) levels stratified by type 2 diabetes.

  • Box and Whisker plot for target(s) plaque levels by type 2 diabetes group (no, yes)

Now we can draw some graphs of plaque target(s) levels per sex and age group as median ± interquartile range.


# Global test
compare_means(HDAC9 ~ DiabetesStatus,  data = AERNASE.clin.hdac9 %>% filter(!is.na(DiabetesStatus)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(DiabetesStatus)), 
                  x = c("DiabetesStatus"),
                  y = "HDAC9", 
                  xlab = "Diabetes status",
                  ylab = "HDAC9 (normalized expression)",
                  # color = "Gender",
                  # palette = c("#D5267B", "#1290D9"),
                  color = "DiabetesStatus",
                  palette = "npg",
                  add = c("median_iqr", "jitter")) +
  stat_compare_means(label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.Diabetes.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ DiabetesStatus, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(DiabetesStatus)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(DiabetesStatus)), 
                  x = c("DiabetesStatus"),
                  y = "HDAC9", 
                  xlab = "Diabetes status per gender",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = c("median_iqr", "jitter")) +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.Diabetes_byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image

# Global test
compare_means(HDAC9_max100 ~ DiabetesStatus,  data = AERNASE.clin.hdac9 %>% filter(!is.na(DiabetesStatus)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(DiabetesStatus)), 
                  x = c("DiabetesStatus"),
                  y = "HDAC9_max100", 
                  xlab = "Diabetes status",
                  ylab = "HDAC9 (normalized expression)",
                  # color = "Gender",
                  # palette = c("#D5267B", "#1290D9"),
                  color = "DiabetesStatus",
                  palette = "npg",
                  add = c("median_iqr", "jitter")) +
  stat_compare_means(label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.Diabetes.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ DiabetesStatus, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(DiabetesStatus)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(DiabetesStatus)), 
                  x = c("DiabetesStatus"),
                  y = "HDAC9_max100", 
                  xlab = "Diabetes status per gender",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = c("median_iqr", "jitter")) +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.Diabetes_byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image

Smoking

We want to create figures of target(s) levels stratified by smoking.

  • Box and Whisker plot for target(s) plaque levels by smoking group (never, ex, current)

Now we can draw some graphs of plaque target(s) levels per sex and age group as median ± interquartile range.


# Global test
compare_means(HDAC9 ~ SmokerStatus,  data = AERNASE.clin.hdac9 %>% filter(!is.na(SmokerStatus)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(SmokerStatus)), 
                  x = c("SmokerStatus"),
                  y = "HDAC9", 
                  xlab = "Smoker status",
                  ylab = "HDAC9 (normalized expression)",
                  # color = "Gender",
                  # palette = c("#D5267B", "#1290D9"),
                  color = "SmokerStatus",
                  palette = "npg",
                  add = c("median_iqr", "jitter")) +
  stat_compare_means(label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.Smoking.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ SmokerStatus, group.by ="Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(SmokerStatus)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(SmokerStatus)), 
                  x = c("SmokerStatus"),
                  y = "HDAC9", 
                  xlab = "Smoker status per gender",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = c("median_iqr", "jitter")) +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.Smoking_byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image

# Global test
compare_means(HDAC9_max100 ~ SmokerStatus,  data = AERNASE.clin.hdac9 %>% filter(!is.na(SmokerStatus)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(SmokerStatus)), 
                  x = c("SmokerStatus"),
                  y = "HDAC9_max100", 
                  xlab = "Smoker status",
                  ylab = "HDAC9 (normalized expression)",
                  # color = "Gender",
                  # palette = c("#D5267B", "#1290D9"),
                  color = "SmokerStatus",
                  palette = "npg",
                  add = c("median_iqr", "jitter")) +
  stat_compare_means(label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.Smoking.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ SmokerStatus, group.by ="Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(SmokerStatus)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(SmokerStatus)), 
                  x = c("SmokerStatus"),
                  y = "HDAC9_max100", 
                  xlab = "Smoker status per gender",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = c("median_iqr", "jitter")) +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.Smoking_byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image

Stenosis

We want to create figures of target(s) levels stratified by stenosis grade.

  • Box and Whisker plot for target(s) plaque levels by stenosis grade group (<70, 70-89, 90+)
library(dplyr)

AERNASE.clin.hdac9 <- AERNASE.clin.hdac9 %>% mutate(StenoticGroup = factor(case_when(stenose == "0-49%" ~ "<70",
                                                     stenose == "0-49%" ~ "<70",
                                                     stenose == "50-70%" ~ "<70",
                                                     stenose == "70-90%" ~ "70-89",
                                                     stenose == "50-99%" ~ "90+",
                                                     stenose == "70-99%" ~ "90+",
                                                     stenose == "100% (Occlusion)" ~ "90+",
                                                     stenose == "90-99%" ~ "90+")))

table(AERNASE.clin.hdac9$StenoticGroup, AERNASE.clin.hdac9$Gender)
       
        female male
  <70        6   34
  70-89     72  199
  90+       69  221
table(AERNASE.clin.hdac9$stenose, AERNASE.clin.hdac9$StenoticGroup)
                  
                   <70 70-89 90+
  missing            0     0   0
  0-49%              2     0   0
  50-70%            38     0   0
  70-90%             0   271   0
  90-99%             0     0 284
  100% (Occlusion)   0     0   5
  NA                 0     0   0
  50-99%             0     0   1
  70-99%             0     0   0
  99                 0     0   0

Now we can draw some graphs of plaque target(s) levels per sex and age group as median ± interquartile range.


# Global test
compare_means(HDAC9 ~ StenoticGroup,  data = AERNASE.clin.hdac9 %>% filter(!is.na(StenoticGroup)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(StenoticGroup)), 
                  x = c("StenoticGroup"),
                  y = "HDAC9", 
                  xlab = "Stenotic grade",
                  ylab = "HDAC9 (normalized expression)",
                  # color = "Gender",
                  # palette = c("#D5267B", "#1290D9"),
                  color = "StenoticGroup",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.Stenosis.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ StenoticGroup, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(StenoticGroup)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(StenoticGroup)), 
                  x = c("StenoticGroup"),
                  y = "HDAC9", 
                  xlab = "Stenotic grade per gender",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.Stenosis_byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image

# Global test
compare_means(HDAC9_max100 ~ StenoticGroup,  data = AERNASE.clin.hdac9 %>% filter(!is.na(StenoticGroup)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(StenoticGroup)), 
                  x = c("StenoticGroup"),
                  y = "HDAC9_max100", 
                  xlab = "Stenotic grade",
                  ylab = "HDAC9 (normalized expression)",
                  # color = "Gender",
                  # palette = c("#D5267B", "#1290D9"),
                  color = "StenoticGroup",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.Stenosis.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ StenoticGroup, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(StenoticGroup)), method = "kruskal.test")
ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(StenoticGroup)), 
                  x = c("StenoticGroup"),
                  y = "HDAC9_max100", 
                  xlab = "Stenotic grade per gender",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format", method = "kruskal.test")

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".max100.plaque.Stenosis_byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image

Symptoms

We want to create per-symptom figures.

library(dplyr)

table(AERNASE.clin.hdac9$AgeGroup, AERNASE.clin.hdac9$AsymptSympt2G)
       
        Asymptomatic Symptomatic
  <55             10          28
  55-64           24         143
  65-74           30         219
  75-84           15         141
  85+              1          12
table(AERNASE.clin.hdac9$Gender, AERNASE.clin.hdac9$AsymptSympt2G)
        
         Asymptomatic Symptomatic
  female           15         138
  male             65         405
table(AERNASE.clin.hdac9$AsymptSympt2G)

Asymptomatic  Symptomatic 
          80          543 

Now we can draw some graphs of plaque target(s) levels per symptom group as median ± interquartile range.


# ?ggpubr::ggboxplot()
my_comparisons <- list(c("Asymptomatic", "Symptomatic"))

compare_means(HDAC9 ~ AsymptSympt2G, data = AERNASE.clin.hdac9, method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AERNASE.clin.hdac9, 
                  x = "AsymptSympt2G", y = "HDAC9",
                  title = "HDAC9 (normalized expression) levels per symptom", 
                  xlab = "Symptoms",
                  ylab = "HDAC9 (normalized expression)",
                  color = "AsymptSympt2G", 
                  # palette = c(uithof_color[16], uithof_color[23]),
                  palette = "npg",
                  add = "dotplot", # Add dotplot
                  add.params = list(binwidth = 0.1, dotsize = 0.3)
          ) +
  stat_compare_means(comparisons = my_comparisons, method = "wilcox.test")
ggpar(p1, legend = c("right"), legend.title = "Symptoms")


ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.AsymptSympt2G.pdf"), plot = last_plot())
Saving 12 x 8 in image
rm(p1)
compare_means(HDAC9 ~ AsymptSympt2G, group.by = "Gender", data = AERNASE.clin.hdac9, method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AERNASE.clin.hdac9, 
                  x = "AsymptSympt2G", y = "HDAC9",
                  title = "HDAC9 (normalized expression) levels per symptom by gender", 
                  xlab = "Symptoms",
                  ylab = "HDAC9 (normalized expression)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "dotplot", # Add dotplot
                  add.params = list(binwidth = 0.1, dotsize = 0.3)
          ) +
  stat_compare_means(aes(group = Gender), label = "p.format",  method = "wilcox.test")
ggpar(p1, legend = c("right"), legend.title = "Symptoms")


ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.AsymptSympt2G.byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
rm(p1)

Alternative graph

# ?ggpubr::ggboxplot()
# compare_means(LRCH1 ~ eGFRGroup, data = AERNASE.clin %>% filter(!is.na(eGFRGroup)), method = "kruskal.test")
# ggpubr::ggboxplot(AERNASE.clin %>% filter(!is.na(eGFRGroup))

cat("Get summary statistics for target:\n")
Get summary statistics for target:
summary(AERNASE.clin.hdac9$HDAC9)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   0.00   11.00   21.00   28.32   37.00  449.00 
cat("\nCount number of values > 100 for target:\n")

Count number of values > 100 for target:
sum(AERNASE.clin.hdac9$HDAC9 > 100)
[1] 12
cat("\nSetting values > 100 for target to 100.\n")

Setting values > 100 for target to 100.
temp <- AERNASE.clin.hdac9 %>% 
  filter(!is.na(AsymptSympt2G))

temp$HDAC9[temp$HDAC9 > 100] <- 100

cat("Get summary statistics for target after fixing values:\n")
Get summary statistics for target after fixing values:
summary(temp$HDAC9)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   0.00   11.00   21.00   26.71   37.00  100.00 
my_comparisons <- list(c("Asymptomatic", "Symptomatic"))

compare_means(HDAC9 ~ AsymptSympt2G, data = temp, method = "kruskal.test")

p1 <- ggpubr::ggboxplot(temp, 
                  x = "AsymptSympt2G", y = "HDAC9",
                  title = "HDAC9 (normalized expression) levels per symptom", 
                  xlab = "Symptoms",
                  ylab = "HDAC9 (normalized expression)",
                  color = "AsymptSympt2G", 
                  # palette = c(uithof_color[16], uithof_color[23]),
                  palette = "npg",
                  add = "jitter", # Add dotplot
                  add.params = list(binwidth = 0.1, dotsize = 0.3)
          ) +
  stat_compare_means(comparisons = my_comparisons, method = "wilcox.test")
ggpar(p1, legend = c("right"), legend.title = "Symptoms")


ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.",TRAIT_OF_INTEREST,".HDAC9.plaque.AsymptSympt2G.noNA_limitCount100.pdf"), plot = last_plot())
Saving 12 x 8 in image
ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.",TRAIT_OF_INTEREST,".HDAC9.plaque.AsymptSympt2G.noNA_limitCount100.ps"), plot = last_plot())
Saving 12 x 8 in image
ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.",TRAIT_OF_INTEREST,".HDAC9.plaque.AsymptSympt2G.noNA_limitCount100.png"), plot = last_plot())
Saving 12 x 8 in image
rm(p1, temp)

Forest plots

We would also like to visualize the multivariable analyses results.

library(ggplot2)
library(openxlsx)
# model1_target <- read.xlsx(paste0(OUT_loc, "/", Today, ".AERNASE.clin.hdac9.Bin.Uni.",TRAIT_OF_INTEREST,".RANK.Symptoms.MODEL1.xlsx"))
# model2_target <- read.xlsx(paste0(OUT_loc, "/", Today, ".AERNASE.clin.hdac9.Bin.Multi.",TRAIT_OF_INTEREST,".RANK.Symptoms.MODEL2.xlsx"))

model1_target <- read.xlsx(paste0(OUT_loc, "/20230531.AERNASE.clin.hdac9.Bin.Uni.",TRAIT_OF_INTEREST,".RANK.Symptoms.MODEL1.xlsx"))
model2_target <- read.xlsx(paste0(OUT_loc, "/20230531.AERNASE.clin.hdac9.Bin.Multi.",TRAIT_OF_INTEREST,".RANK.Symptoms.MODEL2.xlsx"))

model1_target$model <- "univariate"
model2_target$model <- "multivariate"

models_target <- rbind(model1_target, model2_target)
models_target
NA

Forest plots.

dat <- data.frame(group = factor(c("Age, sex-adjusted", "Age, sex, and adjusted for risk factors"), 
                           
                           levels=c("Age, sex, and adjusted for risk factors", "Age, sex-adjusted")),
                  cen = c(models_target$OR[models_target$Predictor=="HDAC9"]),
                  low = c(models_target$low95CI[models_target$Predictor=="HDAC9"]),
                  high = c(models_target$up95CI[models_target$Predictor=="HDAC9"]))

fp <- ggplot(data = dat, aes(x = group, y = cen, ymin = low, ymax = high)) +
  geom_pointrange(linetype = 2, size = 1, colour = c("#1290D9", "#49A01D")) + 
  geom_hline(yintercept = 1, lty = 2) +  # add a dotted line at x=1 after flip
  coord_flip(ylim = c(0.8, 1.7)) +  # flip coordinates (puts labels on y axis)
  xlab("Model") + ylab("OR (95% CI) for symptomatic plaques") +
  ggtitle("Normalized HDAC9 expression") +
  theme_minimal()  # use a white background
print(fp)

ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,".plaque.forest.pdf"), plot = fp)

rm(fp)

HDAC9 vs. cytokines plaque levels correlations

We will plot the correlations of other cytokine plaque levels to the MCP1 plaque levels. These include:

  • IL2
  • IL4
  • IL5
  • IL6
  • IL8
  • IL9
  • IL10
  • IL12
  • IL13
  • IL21
  • INFG
  • TNFA
  • MIF
  • MCP1
  • MIP1a
  • RANTES
  • MIG
  • IP10
  • Eotaxin1
  • TARC
  • PARC
  • MDC
  • OPG
  • sICAM1
  • VEGFA
  • TGFB

In addition we will look at three metalloproteinases which were measured using an activity assay.

  • MMP2
  • MMP8
  • MMP9

The proteins were measured using FACS and LUMINEX. Given the different platforms used (FACS vs. LUMINEX), we will inverse rank-normalize these variables as well to scale them to the same scale as the target(s)` plaque levels.

We will set the measurements that yielded ‘0’ to NA, as it is unlikely that any protein ever has exactly 0 copies. The ‘0’ yielded during the experiment are due to the limits of the detection.

Prepare data

# fix names
names(AEDB.CEA)[names(AEDB.CEA) == "VEFGA"] <- "VEGFA"

# fix names
names(AERNASE.clin.hdac9)[names(AERNASE.clin.hdac9) == "IL6"] <- "IL6rna"

cytokines <- c("IL2", "IL4", "IL5", "IL6", "IL8", "IL9", "IL10", "IL12", "IL13", "IL21", 
               "INFG", "TNFA", "MIF", "MCP1", "MIP1a", "RANTES", "MIG", "IP10", "Eotaxin1", 
               "TARC", "PARC", "MDC", "OPG", "sICAM1", "VEGFA", "TGFB")
metalloproteinases <- c("MMP2", "MMP8", "MMP9")


AERNASE.clin.hdac9 <- merge(AERNASE.clin.hdac9, 
                            subset(AEDB.CEA, select = c("STUDY_NUMBER", 
                                                        cytokines,
                                                        metalloproteinases)), 
                            by.x = "STUDY_NUMBER", by.y = "STUDY_NUMBER", sort = TRUE, all.x = TRUE)

proteins_of_interest <- c(cytokines, metalloproteinases)

proteins_of_interest_rank = unlist(lapply(proteins_of_interest, paste0, "_rank"))

# make variables numerics()
AERNASE.clin.hdac9 <- AERNASE.clin.hdac9 %>%
  mutate_each(funs(as.numeric), proteins_of_interest)
Warning: `funs()` was deprecated in dplyr 0.8.0.
Please use a list of either functions or lambdas: 

  # Simple named list: 
  list(mean = mean, median = median)

  # Auto named with `tibble::lst()`: 
  tibble::lst(mean, median)

  # Using lambdas
  list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
  
for(PROTEIN in 1:length(proteins_of_interest)){

  # UCORBIOGSAqc$Z <- NULL
  var.temp.rank = proteins_of_interest_rank[PROTEIN]
  var.temp = proteins_of_interest[PROTEIN]
  
  cat(paste0("\nSelecting ", var.temp, " and standardising: ", var.temp.rank,".\n"))
  cat(paste0("* changing ", var.temp, " to numeric.\n"))

  # AERNASE.clin.hdac9 <-  AERNASE.clin.hdac9 %>% mutate(AERNASE.clin.hdac9[,var.temp] == replace(AERNASE.clin.hdac9[,var.temp], AERNASE.clin.hdac9[,var.temp]==0, NA))

  AERNASE.clin.hdac9[,var.temp][AERNASE.clin.hdac9[,var.temp]==0.000000]=NA

  cat(paste0("* standardising ", var.temp, 
             " (mean: ",round(mean(!is.na(AERNASE.clin.hdac9[,var.temp])), digits = 6),
             ", n = ",sum(!is.na(AERNASE.clin.hdac9[,var.temp])),").\n"))
  
  AERNASE.clin.hdac9 <- AERNASE.clin.hdac9 %>%
      mutate_at(vars(var.temp), 
        # list(Z = ~ (AERNASE.clin.hdac9[,var.temp] - mean(AERNASE.clin.hdac9[,var.temp], na.rm = TRUE))/sd(AERNASE.clin.hdac9[,var.temp], na.rm = TRUE))
        list(RANK = ~ qnorm((rank(AERNASE.clin.hdac9[,var.temp], na.last = "keep") - 0.5) / sum(!is.na(AERNASE.clin.hdac9[,var.temp]))))
      )
  # str(UCORBIOGSAqc$Z)
  cat(paste0("* renaming RANK to ", var.temp.rank,".\n"))
  AERNASE.clin.hdac9[,var.temp.rank] <- NULL
  names(AERNASE.clin.hdac9)[names(AERNASE.clin.hdac9) == "RANK"] <- var.temp.rank
}

Selecting IL2 and standardising: IL2_rank.
* changing IL2 to numeric.
* standardising IL2 (mean: 0.295345, n = 184).
* renaming RANK to IL2_rank.

Selecting IL4 and standardising: IL4_rank.
* changing IL4 to numeric.
* standardising IL4 (mean: 0.266453, n = 166).
* renaming RANK to IL4_rank.

Selecting IL5 and standardising: IL5_rank.
* changing IL5 to numeric.
* standardising IL5 (mean: 0.29053, n = 181).
* renaming RANK to IL5_rank.

Selecting IL6 and standardising: IL6_rank.
* changing IL6 to numeric.
* standardising IL6 (mean: 0.306581, n = 191).
* renaming RANK to IL6_rank.

Selecting IL8 and standardising: IL8_rank.
* changing IL8 to numeric.
* standardising IL8 (mean: 0.288925, n = 180).
* renaming RANK to IL8_rank.

Selecting IL9 and standardising: IL9_rank.
* changing IL9 to numeric.
* standardising IL9 (mean: 0.338684, n = 211).
* renaming RANK to IL9_rank.

Selecting IL10 and standardising: IL10_rank.
* changing IL10 to numeric.
* standardising IL10 (mean: 0.255217, n = 159).
* renaming RANK to IL10_rank.

Selecting IL12 and standardising: IL12_rank.
* changing IL12 to numeric.
* standardising IL12 (mean: 0.269663, n = 168).
* renaming RANK to IL12_rank.

Selecting IL13 and standardising: IL13_rank.
* changing IL13 to numeric.
* standardising IL13 (mean: 0.372392, n = 232).
* renaming RANK to IL13_rank.

Selecting IL21 and standardising: IL21_rank.
* changing IL21 to numeric.
* standardising IL21 (mean: 0.372392, n = 232).
* renaming RANK to IL21_rank.

Selecting INFG and standardising: INFG_rank.
* changing INFG to numeric.
* standardising INFG (mean: 0.280899, n = 175).
* renaming RANK to INFG_rank.

Selecting TNFA and standardising: TNFA_rank.
* changing TNFA to numeric.
* standardising TNFA (mean: 0.266453, n = 166).
* renaming RANK to TNFA_rank.

Selecting MIF and standardising: MIF_rank.
* changing MIF to numeric.
* standardising MIF (mean: 0.372392, n = 232).
* renaming RANK to MIF_rank.

Selecting MCP1 and standardising: MCP1_rank.
* changing MCP1 to numeric.
* standardising MCP1 (mean: 0.369181, n = 230).
* renaming RANK to MCP1_rank.

Selecting MIP1a and standardising: MIP1a_rank.
* changing MIP1a to numeric.
* standardising MIP1a (mean: 0.345104, n = 215).
* renaming RANK to MIP1a_rank.

Selecting RANTES and standardising: RANTES_rank.
* changing RANTES to numeric.
* standardising RANTES (mean: 0.365971, n = 228).
* renaming RANK to RANTES_rank.

Selecting MIG and standardising: MIG_rank.
* changing MIG to numeric.
* standardising MIG (mean: 0.365971, n = 228).
* renaming RANK to MIG_rank.

Selecting IP10 and standardising: IP10_rank.
* changing IP10 to numeric.
* standardising IP10 (mean: 0.333868, n = 208).
* renaming RANK to IP10_rank.

Selecting Eotaxin1 and standardising: Eotaxin1_rank.
* changing Eotaxin1 to numeric.
* standardising Eotaxin1 (mean: 0.372392, n = 232).
* renaming RANK to Eotaxin1_rank.

Selecting TARC and standardising: TARC_rank.
* changing TARC to numeric.
* standardising TARC (mean: 0.329053, n = 205).
* renaming RANK to TARC_rank.

Selecting PARC and standardising: PARC_rank.
* changing PARC to numeric.
* standardising PARC (mean: 0.372392, n = 232).
* renaming RANK to PARC_rank.

Selecting MDC and standardising: MDC_rank.
* changing MDC to numeric.
* standardising MDC (mean: 0.346709, n = 216).
* renaming RANK to MDC_rank.

Selecting OPG and standardising: OPG_rank.
* changing OPG to numeric.
* standardising OPG (mean: 0.372392, n = 232).
* renaming RANK to OPG_rank.

Selecting sICAM1 and standardising: sICAM1_rank.
* changing sICAM1 to numeric.
* standardising sICAM1 (mean: 0.372392, n = 232).
* renaming RANK to sICAM1_rank.

Selecting VEGFA and standardising: VEGFA_rank.
* changing VEGFA to numeric.
* standardising VEGFA (mean: 0.322632, n = 201).
* renaming RANK to VEGFA_rank.

Selecting TGFB and standardising: TGFB_rank.
* changing TGFB to numeric.
* standardising TGFB (mean: 0.372392, n = 232).
* renaming RANK to TGFB_rank.

Selecting MMP2 and standardising: MMP2_rank.
* changing MMP2 to numeric.
* standardising MMP2 (mean: 0.373997, n = 233).
* renaming RANK to MMP2_rank.

Selecting MMP8 and standardising: MMP8_rank.
* changing MMP8 to numeric.
* standardising MMP8 (mean: 0.373997, n = 233).
* renaming RANK to MMP8_rank.

Selecting MMP9 and standardising: MMP9_rank.
* changing MMP9 to numeric.
* standardising MMP9 (mean: 0.373997, n = 233).
* renaming RANK to MMP9_rank.
# rm(var.temp, var.temp.rank)

Visualize transformations

We will just visualize these transformations.

proteins_of_interest_rank_target <- c("HDAC9", proteins_of_interest_rank)

proteins_of_interest_target <- c("HDAC9", proteins_of_interest)

for(PROTEIN in proteins_of_interest_target){
  cat(paste0("Plotting protein ", PROTEIN, ".\n"))
  
  p1 <- ggpubr::gghistogram(AERNASE.clin.hdac9, PROTEIN,
                    # y = "..count..",
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"),
                    add = "mean",
                    # rug = TRUE,
                    # add.params =  list(color = "black", linetype = 2),
                    title = paste0(PROTEIN, " plaque levels"),
                    xlab = "",
                    ggtheme = theme_minimal())
  print(p1)
  
}
Plotting protein HDAC9.
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.
Plotting protein IL2.
Plotting protein IL4.
Plotting protein IL5.
Plotting protein IL6.
Plotting protein IL8.
Plotting protein IL9.
Plotting protein IL10.
Plotting protein IL12.
Plotting protein IL13.
Plotting protein IL21.
Plotting protein INFG.
Plotting protein TNFA.
Plotting protein MIF.
Plotting protein MCP1.
Plotting protein MIP1a.
Plotting protein RANTES.
Plotting protein MIG.
Plotting protein IP10.
Plotting protein Eotaxin1.
Plotting protein TARC.
Plotting protein PARC.
Plotting protein MDC.
Plotting protein OPG.
Plotting protein sICAM1.
Plotting protein VEGFA.
Plotting protein TGFB.
Plotting protein MMP2.
Plotting protein MMP8.
Plotting protein MMP9.

for(PROTEIN in proteins_of_interest_rank_target){
  cat(paste0("Plotting protein ", PROTEIN, ".\n"))
  
  p1 <- ggpubr::gghistogram(AERNASE.clin.hdac9, PROTEIN,
                    # y = "..count..",
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"),
                    add = "mean",
                    # rug = TRUE,
                    # add.params =  list(color = "black", linetype = 2),
                    title = paste0(PROTEIN, " plaque levels"),
                    xlab = "inverse-normal transformation",
                    ggtheme = theme_minimal())
  print(p1)
  
}
Plotting protein HDAC9.
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.
Plotting protein IL2_rank.
Plotting protein IL4_rank.
Plotting protein IL5_rank.
Plotting protein IL6_rank.
Plotting protein IL8_rank.
Plotting protein IL9_rank.
Plotting protein IL10_rank.
Plotting protein IL12_rank.
Plotting protein IL13_rank.
Plotting protein IL21_rank.
Plotting protein INFG_rank.
Plotting protein TNFA_rank.
Plotting protein MIF_rank.
Plotting protein MCP1_rank.
Plotting protein MIP1a_rank.
Plotting protein RANTES_rank.
Plotting protein MIG_rank.
Plotting protein IP10_rank.
Plotting protein Eotaxin1_rank.
Plotting protein TARC_rank.
Plotting protein PARC_rank.
Plotting protein MDC_rank.
Plotting protein OPG_rank.
Plotting protein sICAM1_rank.
Plotting protein VEGFA_rank.
Plotting protein TGFB_rank.
Plotting protein MMP2_rank.
Plotting protein MMP8_rank.
Plotting protein MMP9_rank.

NA

Correlations

Here we calculate correlations between target(s) and 28 other cytokines. We use Spearman’s test, thus, correlations a given in rho. Please note the indications of measurement methods:

  • L: LUMINEX
  • E: ELISA
  • a: activity assay
# Installation of ggcorrplot()
# --------------------------------
if(!require(devtools)) 
  install.packages("devtools")
devtools::install_github("kassambara/ggcorrplot")
Using github PAT from envvar GITHUB_PAT
Skipping install of 'ggcorrplot' from a github remote, the SHA1 (0a85456d) has not changed since last install.
  Use `force = TRUE` to force installation
library(ggcorrplot)

# Creating matrix - inverse-rank transformation
# --------------------------------
temp <- subset(AERNASE.clin.hdac9, 
                          select = c(proteins_of_interest_rank_target)
                                    )

# str(AEDB.CEA.temp)
matrix.RANK <- as.matrix(temp)
rm(temp)

corr_biomarkers.rank <- round(cor(matrix.RANK, 
                             use = "pairwise.complete.obs", #the correlation or covariance between each pair of variables is computed using all complete pairs of observations on those variables
                             method = "spearman"), 3)
# corr_biomarkers.rank

rename_proteins_of_interest_target <- c("HDAC9 (RNA)", 
                                    "IL2", "IL4", "IL5", "IL6", "IL8", "IL9", "IL10", "IL12", 
                                    "IL13 (L)", "IL21 (L)", 
                                    "INFG", "TNFA", "MIF (L)", 
                                    "MCP1 (L)", "MIP1a (L)", "RANTES (L)", "MIG (L)", "IP10 (L)", 
                                    "Eotaxin1 (L)", "TARC (L)", "PARC (L)", "MDC (L)", 
                                    "OPG (L)", "sICAM1 (L)", "VEGFA (E)", "TGFB (E)", "MMP2 (a)", "MMP8 (a)", "MMP9 (a)")
colnames(corr_biomarkers.rank) <- c(rename_proteins_of_interest_target)
rownames(corr_biomarkers.rank) <- c(rename_proteins_of_interest_target)

corr_biomarkers_p.rank <- ggcorrplot::cor_pmat(matrix.RANK, use = "pairwise.complete.obs", method = "spearman")
Warning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with tiesWarning: Cannot compute exact p-value with ties
# ++++++++++++++++++++++++++++
# flattenCorrMatrix
# ++++++++++++++++++++++++++++
# cormat : matrix of the correlation coefficients
# pmat : matrix of the correlation p-values
flattenCorrMatrix <- function(cormat, pmat) {
  ut <- upper.tri(cormat)
  data.frame(
    row = rownames(cormat)[row(cormat)[ut]],
    column = rownames(cormat)[col(cormat)[ut]],
    cor  =(cormat)[ut],
    p = pmat[ut]
    )
}

corr_biomarkers.rank.df <- flattenCorrMatrix(corr_biomarkers.rank, corr_biomarkers_p.rank)


names(corr_biomarkers.rank.df)[names(corr_biomarkers.rank.df) == "row"] <- "Cytokine_X"
names(corr_biomarkers.rank.df)[names(corr_biomarkers.rank.df) == "column"] <- "CytokineY"
names(corr_biomarkers.rank.df)[names(corr_biomarkers.rank.df) == "cor"] <- "SpearmanRho"

DT::datatable(corr_biomarkers.rank.df)

fwrite(corr_biomarkers.rank.df, file = paste0(OUT_loc, "/",Today,".correlation_cytokines.txt"))
# Add correlation coefficients
# --------------------------------
# argument lab = TRUE
p1 <- ggcorrplot(corr_biomarkers.rank, 
           method = "square", 
           type = "lower",
           title = "Cross biomarker correlations", 
           show.legend = TRUE, legend.title = bquote("Spearman's"~italic(rho)),
           ggtheme = ggplot2::theme_minimal, outline.color = "#FFFFFF",
           show.diag = TRUE,
           hc.order = FALSE, 
           lab = FALSE,
           digits = 3,
           tl.cex = 16,
           # xlab = c("MCP1"),
           # p.mat = corr_biomarkers_p.rank, sig.level = 0.05,
           colors = c("#1290D9", "#FFFFFF", "#E55738"))
p1

ggsave(filename = paste0(PLOT_loc, "/", Today, ".correlation_cytokines.png"), plot = last_plot())
Saving 12 x 8 in image
ggsave(filename = paste0(PLOT_loc, "/", Today, ".correlation_cytokines.pdf"), plot = last_plot())
Saving 12 x 8 in image
rm(p1)

While visually attractive we are not necessarily interested in the correlations between all the cytokines, rather of target(s)` with other cytokines only.

temp <- subset(corr_biomarkers.rank.df, Cytokine_X == "HDAC9 (RNA)" )
temp$p_log10 <- -log10(temp$p)
p_threshold <- -log10(0.05/nrow(temp))
p_threshold
[1] 2.763428
library(dplyr)
library(tidyr)
library(ggplot2)

p1 <- ggpubr::ggbarplot(temp, x = "CytokineY", y = "SpearmanRho",
          fill = "CytokineY",               # change fill color by cyl
          # color = "white",            # Set bar border colors to white
          palette = uithof_color,            # jco journal color palett. see ?ggpar
          xlab = "Cytokine",
          ylab = "Spearman's rho", # expression("Spearman's"~italic(rho)),
          sort.val = "desc",          # Sort the value in dscending order
          sort.by.groups = FALSE,     # Don't sort inside each group
          x.text.angle = 45, # Rotate vertically x axis texts
          cex = 1.25
          )
ggpar(p1, legend = "bottom", 
      legend.title = "") +
  theme(axis.text.x = element_text(size = 14),
        axis.text.y = element_text(size = 14),
        axis.title.x = element_text(size = 18),
        axis.title.y = element_text(size = 18)) 


ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,"_vs_Cytokines.png"), plot = last_plot())
Saving 12 x 8 in image
ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,"_vs_Cytokines.pdf"), plot = last_plot())
Saving 12 x 8 in image
rm(p1)

Another version - probably not good.

temp <- subset(corr_biomarkers.rank.df, Cytokine_X == "HDAC9 (RNA)" )
temp$p_log10 <- -log10(temp$p)
p_threshold <- -log10(0.05/nrow(temp))
p_threshold
[1] 2.763428
p1 <- ggdotchart(temp, x = "CytokineY", y = "p_log10",
           color = "CytokineY", #fill = "CytokineY",                              # Color by groups
           palette = uithof_color, # Custom color palette
           xlab = "Cytokine",
           ylab = "log10(P)", # expression(log[10]~"("~italic(p)~")-value"),
           # ylim = c(0, 9),
           sorting = "descending",                       # Sort value in descending order
           add = "segments",                             # Add segments from y = 0 to dots
           rotate = FALSE,                                # Rotate vertically
           # group = "CytokineY",                                # Order by groups
           dot.size = 16,                                 # Large dot size
           label = round(temp$SpearmanRho, digits = 3),                        # Add mpg values as dot labels
           font.label = list(color = "white", size = 12, 
                             vjust = 0.5)                   
           )
ggpar(p1, legend = "", 
      legend.title = "") +
  theme(axis.text.x = element_text(size = 14),
        axis.text.y = element_text(size = 14),
        axis.title.x = element_text(size = 18),
        axis.title.y = element_text(size = 18))


ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,"_vs_Cytokines.dotchart.png"), plot = last_plot())
Saving 12 x 8 in image
ggsave(file = paste0(PLOT_loc, "/",Today,".AERNASE.clin.hdac9.",TRAIT_OF_INTEREST,"_vs_Cytokines.dotchart.pdf"), plot = last_plot())
Saving 12 x 8 in image
rm(temp, p1)

HDAC9 vs. cytokines plaque levels

Model 1

In this model we correct for Age, Gender, and year of surgery.

Here we use the inverse-rank normalized data - visually this is more normally distributed.

Analysis of plaque cytokines traits as a function of plaque target(s) levels.


GLM.results <- data.frame(matrix(NA, ncol = 15, nrow = 0))
cat("Running linear regression...\n")
Running linear regression...
for (protein in 1:length(TRAITS.TARGET.RANK)) {
  PROTEIN = TRAITS.TARGET.RANK[protein]
  cat(paste0("\nAnalysis of ",PROTEIN,".\n"))
  for (trait in 1:length(proteins_of_interest_rank)) {
    TRAIT = proteins_of_interest_rank[trait]
    cat(paste0("\n- processing ",TRAIT,"\n\n"))
    currentDF <- as.data.frame(AERNASE.clin.hdac9 %>%
      dplyr::select(., PROTEIN, TRAIT, COVARIATES_M1) %>%
      filter(complete.cases(.))) %>%
      filter_if(~is.numeric(.), all_vars(!is.infinite(.)))
    # for debug
    # print(DT::datatable(currentDF))
    # print(nrow(currentDF))
    # print(str(currentDF))
    ### univariate
    # fit <- lm(currentDF[,PROTEIN] ~ currentDF[,TRAIT] + Age + Gender + ORdate_year, data = currentDF)
    fit <- lm(currentDF[,PROTEIN] ~ currentDF[,TRAIT] + Age + Gender + ORdate_epoch, data = currentDF)
    model_step <- stepAIC(fit, direction = "both", trace = FALSE)
    print(model_step)
    print(summary(fit))

    GLM.results.TEMP <- data.frame(matrix(NA, ncol = 15, nrow = 0))
    GLM.results.TEMP[1,] = GLM.CON(fit, "AEDB.CEA", PROTEIN, TRAIT, verbose = TRUE)
    GLM.results = rbind(GLM.results, GLM.results.TEMP)
  }
}

Analysis of HDAC9.

- processing IL2_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
      25.54  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-27.394 -14.573  -4.190   8.337 162.308 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)
(Intercept)        87.089523  67.253755   1.295    0.197
currentDF[, TRAIT] -2.065605   1.865974  -1.107    0.270
Age                 0.069517   0.225799   0.308    0.759
Gendermale          2.076675   4.380429   0.474    0.636
ORdate_epoch       -0.005455   0.005311  -1.027    0.306

Residual standard error: 24.79 on 179 degrees of freedom
Multiple R-squared:  0.01339,   Adjusted R-squared:  -0.008654 
F-statistic: 0.6075 on 4 and 179 DF,  p-value: 0.6577

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' IL2_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: IL2_rank 
Effect size...............: -2.065605 
Standard error............: 1.865974 
Odds ratio (effect size)..: 0.127 
Lower 95% CI..............: 0.003 
Upper 95% CI..............: 4.912 
T-value...................: -1.106984 
P-value...................: 0.269786 
R^2.......................: 0.013393 
Adjusted r^2..............: -0.008654 
Sample size of AE DB......: 623 
Sample size of model......: 184 
Missing data %............: 70.46549 

- processing IL4_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
      26.58  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-28.084 -17.297  -5.344   5.559 218.337 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)
(Intercept)        60.651036  91.603633   0.662    0.509
currentDF[, TRAIT] -0.561106   2.475638  -0.227    0.821
Age                 0.131814   0.297249   0.443    0.658
Gendermale          3.948413   5.833017   0.677    0.499
ORdate_epoch       -0.003716   0.007257  -0.512    0.609

Residual standard error: 30.89 on 161 degrees of freedom
Multiple R-squared:  0.006257,  Adjusted R-squared:  -0.01843 
F-statistic: 0.2534 on 4 and 161 DF,  p-value: 0.9072

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' IL4_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: IL4_rank 
Effect size...............: -0.561106 
Standard error............: 2.475638 
Odds ratio (effect size)..: 0.571 
Lower 95% CI..............: 0.004 
Upper 95% CI..............: 73.05 
T-value...................: -0.226651 
P-value...................: 0.8209826 
R^2.......................: 0.006257 
Adjusted r^2..............: -0.018433 
Sample size of AE DB......: 623 
Sample size of model......: 166 
Missing data %............: 73.35474 

- processing IL5_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
      26.19  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-27.186 -16.269  -5.412   4.875 219.405 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)
(Intercept)        73.721510  83.734923   0.880    0.380
currentDF[, TRAIT] -1.776930   2.284343  -0.778    0.438
Age                 0.093037   0.276642   0.336    0.737
Gendermale          3.730928   5.381239   0.693    0.489
ORdate_epoch       -0.004567   0.006698  -0.682    0.496

Residual standard error: 29.97 on 176 degrees of freedom
Multiple R-squared:  0.009617,  Adjusted R-squared:  -0.01289 
F-statistic: 0.4273 on 4 and 176 DF,  p-value: 0.7888

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' IL5_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: IL5_rank 
Effect size...............: -1.77693 
Standard error............: 2.284343 
Odds ratio (effect size)..: 0.169 
Lower 95% CI..............: 0.002 
Upper 95% CI..............: 14.885 
T-value...................: -0.777873 
P-value...................: 0.4376881 
R^2.......................: 0.009617 
Adjusted r^2..............: -0.012891 
Sample size of AE DB......: 623 
Sample size of model......: 181 
Missing data %............: 70.94703 

- processing IL6_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
      26.04  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-28.063 -16.072  -5.804   5.847 220.416 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)
(Intercept)        49.746906  73.136217   0.680    0.497
currentDF[, TRAIT] -1.772356   2.180601  -0.813    0.417
Age                 0.123328   0.264826   0.466    0.642
Gendermale          2.105297   4.940344   0.426    0.670
ORdate_epoch       -0.002699   0.005824  -0.464    0.644

Residual standard error: 29.35 on 186 degrees of freedom
Multiple R-squared:  0.008199,  Adjusted R-squared:  -0.01313 
F-statistic: 0.3844 on 4 and 186 DF,  p-value: 0.8196

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' IL6_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: IL6_rank 
Effect size...............: -1.772356 
Standard error............: 2.180601 
Odds ratio (effect size)..: 0.17 
Lower 95% CI..............: 0.002 
Upper 95% CI..............: 12.202 
T-value...................: -0.812783 
P-value...................: 0.4173817 
R^2.......................: 0.008199 
Adjusted r^2..............: -0.01313 
Sample size of AE DB......: 623 
Sample size of model......: 191 
Missing data %............: 69.34189 

- processing IL8_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
      25.21  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-26.603 -15.456  -4.631   5.804 221.136 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)
(Intercept)        67.269066  72.441025   0.929    0.354
currentDF[, TRAIT]  1.086280   2.162178   0.502    0.616
Age                 0.087404   0.247409   0.353    0.724
Gendermale         -0.027405   4.923287  -0.006    0.996
ORdate_epoch       -0.003844   0.005758  -0.668    0.505

Residual standard error: 27.72 on 175 degrees of freedom
Multiple R-squared:  0.00367,   Adjusted R-squared:  -0.0191 
F-statistic: 0.1611 on 4 and 175 DF,  p-value: 0.9577

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' IL8_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: IL8_rank 
Effect size...............: 1.08628 
Standard error............: 2.162178 
Odds ratio (effect size)..: 2.963 
Lower 95% CI..............: 0.043 
Upper 95% CI..............: 205.234 
T-value...................: 0.502401 
P-value...................: 0.6160173 
R^2.......................: 0.00367 
Adjusted r^2..............: -0.019104 
Sample size of AE DB......: 623 
Sample size of model......: 180 
Missing data %............: 71.10754 

- processing IL9_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT], data = currentDF)

Coefficients:
       (Intercept)  currentDF[, TRAIT]  
            28.024               4.624  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-41.38 -17.94  -8.00   5.53 414.61 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)  
(Intercept)        -73.867362  92.194148  -0.801   0.4239  
currentDF[, TRAIT]   4.940574   2.842073   1.738   0.0836 .
Age                  0.298577   0.351069   0.850   0.3960  
Gendermale           5.353704   6.545811   0.818   0.4144  
ORdate_epoch         0.006181   0.007047   0.877   0.3814  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 40.88 on 206 degrees of freedom
Multiple R-squared:  0.0226,    Adjusted R-squared:  0.003626 
F-statistic: 1.191 on 4 and 206 DF,  p-value: 0.3158

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' IL9_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: IL9_rank 
Effect size...............: 4.940574 
Standard error............: 2.842073 
Odds ratio (effect size)..: 139.851 
Lower 95% CI..............: 0.533 
Upper 95% CI..............: 36718.55 
T-value...................: 1.73837 
P-value...................: 0.0836398 
R^2.......................: 0.022604 
Adjusted r^2..............: 0.003626 
Sample size of AE DB......: 623 
Sample size of model......: 211 
Missing data %............: 66.13162 

- processing IL10_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
      24.83  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-28.342 -15.946  -5.041   5.721 165.217 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)
(Intercept)        124.909366  82.062646   1.522    0.130
currentDF[, TRAIT]  -0.587872   2.155866  -0.273    0.785
Age                  0.084426   0.257199   0.328    0.743
Gendermale           2.419501   4.987664   0.485    0.628
ORdate_epoch        -0.008691   0.006431  -1.352    0.178

Residual standard error: 26.07 on 154 degrees of freedom
Multiple R-squared:  0.01389,   Adjusted R-squared:  -0.01172 
F-statistic: 0.5422 on 4 and 154 DF,  p-value: 0.7049

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' IL10_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: IL10_rank 
Effect size...............: -0.587872 
Standard error............: 2.155866 
Odds ratio (effect size)..: 0.556 
Lower 95% CI..............: 0.008 
Upper 95% CI..............: 38.001 
T-value...................: -0.272685 
P-value...................: 0.7854607 
R^2.......................: 0.013889 
Adjusted r^2..............: -0.011725 
Sample size of AE DB......: 623 
Sample size of model......: 159 
Missing data %............: 74.47833 

- processing IL12_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
      27.23  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-28.668 -16.162  -5.598   6.304 215.169 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)
(Intercept)        74.693706  91.325457   0.818    0.415
currentDF[, TRAIT] -2.873685   2.439555  -1.178    0.241
Age                 0.087055   0.296200   0.294    0.769
Gendermale          4.447111   5.708970   0.779    0.437
ORdate_epoch       -0.004576   0.007217  -0.634    0.527

Residual standard error: 30.69 on 163 degrees of freedom
Multiple R-squared:  0.01495,   Adjusted R-squared:  -0.00922 
F-statistic: 0.6186 on 4 and 163 DF,  p-value: 0.6499

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' IL12_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: IL12_rank 
Effect size...............: -2.873685 
Standard error............: 2.439555 
Odds ratio (effect size)..: 0.056 
Lower 95% CI..............: 0 
Upper 95% CI..............: 6.739 
T-value...................: -1.177955 
P-value...................: 0.2405317 
R^2.......................: 0.014953 
Adjusted r^2..............: -0.00922 
Sample size of AE DB......: 623 
Sample size of model......: 168 
Missing data %............: 73.03371 

- processing IL13_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
      27.62  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-35.36 -17.66  -7.84   5.55 415.08 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)
(Intercept)        -64.323527  87.644761  -0.734    0.464
currentDF[, TRAIT]   3.132263   2.637430   1.188    0.236
Age                  0.308054   0.321748   0.957    0.339
Gendermale           4.216680   6.052396   0.697    0.487
ORdate_epoch         0.005405   0.006755   0.800    0.424

Residual standard error: 39.53 on 227 degrees of freedom
Multiple R-squared:  0.01487,   Adjusted R-squared:  -0.00249 
F-statistic: 0.8566 on 4 and 227 DF,  p-value: 0.4908

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' IL13_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: IL13_rank 
Effect size...............: 3.132263 
Standard error............: 2.63743 
Odds ratio (effect size)..: 22.926 
Lower 95% CI..............: 0.13 
Upper 95% CI..............: 4030.42 
T-value...................: 1.18762 
P-value...................: 0.2362245 
R^2.......................: 0.014869 
Adjusted r^2..............: -0.00249 
Sample size of AE DB......: 623 
Sample size of model......: 232 
Missing data %............: 62.76084 

- processing IL21_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
      27.62  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-31.99 -17.35  -7.93   5.69 415.55 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)
(Intercept)        -67.795115  87.695514  -0.773    0.440
currentDF[, TRAIT]   2.145421   2.630724   0.816    0.416
Age                  0.285867   0.321271   0.890    0.375
Gendermale           4.278613   6.068842   0.705    0.482
ORdate_epoch         0.005798   0.006750   0.859    0.391

Residual standard error: 39.59 on 227 degrees of freedom
Multiple R-squared:  0.01164,   Adjusted R-squared:  -0.005772 
F-statistic: 0.6686 on 4 and 227 DF,  p-value: 0.6144

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' IL21_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: IL21_rank 
Effect size...............: 2.145421 
Standard error............: 2.630724 
Odds ratio (effect size)..: 8.546 
Lower 95% CI..............: 0.049 
Upper 95% CI..............: 1482.729 
T-value...................: 0.815525 
P-value...................: 0.4156266 
R^2.......................: 0.011644 
Adjusted r^2..............: -0.005772 
Sample size of AE DB......: 623 
Sample size of model......: 232 
Missing data %............: 62.76084 

- processing INFG_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
      27.45  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-27.768 -16.019  -5.336   5.937 217.710 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)
(Intercept)        48.200209  87.073464   0.554    0.581
currentDF[, TRAIT] -1.199789   2.508853  -0.478    0.633
Age                 0.107104   0.287959   0.372    0.710
Gendermale          2.281405   5.736982   0.398    0.691
ORdate_epoch       -0.002397   0.006842  -0.350    0.727

Residual standard error: 30.55 on 170 degrees of freedom
Multiple R-squared:  0.003914,  Adjusted R-squared:  -0.01952 
F-statistic: 0.167 on 4 and 170 DF,  p-value: 0.9549

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' INFG_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: INFG_rank 
Effect size...............: -1.199789 
Standard error............: 2.508853 
Odds ratio (effect size)..: 0.301 
Lower 95% CI..............: 0.002 
Upper 95% CI..............: 41.164 
T-value...................: -0.478222 
P-value...................: 0.6331066 
R^2.......................: 0.003914 
Adjusted r^2..............: -0.019523 
Sample size of AE DB......: 623 
Sample size of model......: 175 
Missing data %............: 71.91011 

- processing TNFA_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
      26.81  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-27.719 -16.423  -5.891   5.925 215.388 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)
(Intercept)        70.099936  90.904819   0.771    0.442
currentDF[, TRAIT] -2.394261   2.429518  -0.985    0.326
Age                 0.167410   0.298046   0.562    0.575
Gendermale          3.082801   5.659187   0.545    0.587
ORdate_epoch       -0.004591   0.007154  -0.642    0.522

Residual standard error: 30.81 on 161 degrees of freedom
Multiple R-squared:  0.01304,   Adjusted R-squared:  -0.01148 
F-statistic: 0.5317 on 4 and 161 DF,  p-value: 0.7126

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' TNFA_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: TNFA_rank 
Effect size...............: -2.394261 
Standard error............: 2.429518 
Odds ratio (effect size)..: 0.091 
Lower 95% CI..............: 0.001 
Upper 95% CI..............: 10.672 
T-value...................: -0.985488 
P-value...................: 0.3258631 
R^2.......................: 0.013037 
Adjusted r^2..............: -0.011484 
Sample size of AE DB......: 623 
Sample size of model......: 166 
Missing data %............: 73.35474 

- processing MIF_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
      27.62  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-30.82 -17.23  -7.33   4.97 414.47 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)
(Intercept)        -83.502796  97.752759  -0.854    0.394
currentDF[, TRAIT]   0.862190   2.915813   0.296    0.768
Age                  0.265892   0.320651   0.829    0.408
Gendermale           4.696186   6.059564   0.775    0.439
ORdate_epoch         0.007132   0.007526   0.948    0.344

Residual standard error: 39.64 on 227 degrees of freedom
Multiple R-squared:  0.00913,   Adjusted R-squared:  -0.00833 
F-statistic: 0.5229 on 4 and 227 DF,  p-value: 0.719

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' MIF_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: MIF_rank 
Effect size...............: 0.86219 
Standard error............: 2.915813 
Odds ratio (effect size)..: 2.368 
Lower 95% CI..............: 0.008 
Upper 95% CI..............: 718.513 
T-value...................: 0.295695 
P-value...................: 0.7677336 
R^2.......................: 0.00913 
Adjusted r^2..............: -0.00833 
Sample size of AE DB......: 623 
Sample size of model......: 232 
Missing data %............: 62.76084 

- processing MCP1_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
       27.7  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-31.89 -17.58  -7.68   5.16 414.82 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)
(Intercept)        -74.500811  90.064634  -0.827    0.409
currentDF[, TRAIT]   0.588396   2.698328   0.218    0.828
Age                  0.283143   0.325825   0.869    0.386
Gendermale           4.660364   6.137923   0.759    0.448
ORdate_epoch         0.006329   0.006905   0.917    0.360

Residual standard error: 39.81 on 225 degrees of freedom
Multiple R-squared:  0.009151,  Adjusted R-squared:  -0.008464 
F-statistic: 0.5195 on 4 and 225 DF,  p-value: 0.7215

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' MCP1_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: MCP1_rank 
Effect size...............: 0.588396 
Standard error............: 2.698328 
Odds ratio (effect size)..: 1.801 
Lower 95% CI..............: 0.009 
Upper 95% CI..............: 356.779 
T-value...................: 0.218059 
P-value...................: 0.8275805 
R^2.......................: 0.009151 
Adjusted r^2..............: -0.008464 
Sample size of AE DB......: 623 
Sample size of model......: 230 
Missing data %............: 63.08186 

- processing MIP1a_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
      27.93  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-31.49 -17.37  -8.05   5.80 415.36 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)
(Intercept)        -64.714720  91.395195  -0.708    0.480
currentDF[, TRAIT]   1.715264   2.798550   0.613    0.541
Age                  0.274716   0.340846   0.806    0.421
Gendermale           5.269177   6.525565   0.807    0.420
ORdate_epoch         0.005579   0.007011   0.796    0.427

Residual standard error: 40.79 on 210 degrees of freedom
Multiple R-squared:  0.01076,   Adjusted R-squared:  -0.008082 
F-statistic: 0.5711 on 4 and 210 DF,  p-value: 0.6839

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' MIP1a_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: MIP1a_rank 
Effect size...............: 1.715264 
Standard error............: 2.79855 
Odds ratio (effect size)..: 5.558 
Lower 95% CI..............: 0.023 
Upper 95% CI..............: 1339.997 
T-value...................: 0.612912 
P-value...................: 0.540598 
R^2.......................: 0.010761 
Adjusted r^2..............: -0.008082 
Sample size of AE DB......: 623 
Sample size of model......: 215 
Missing data %............: 65.48957 

- processing RANTES_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + ORdate_epoch, 
    data = currentDF)

Coefficients:
       (Intercept)  currentDF[, TRAIT]        ORdate_epoch  
        -123.25756             5.92451             0.01202  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-35.67 -18.04  -6.88   6.44 395.66 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)  
(Intercept)        -1.687e+02  9.755e+01  -1.729   0.0851 .
currentDF[, TRAIT]  6.668e+00  2.933e+00   2.274   0.0239 *
Age                 4.110e-01  3.267e-01   1.258   0.2096  
Gendermale          4.950e+00  6.135e+00   0.807   0.4206  
ORdate_epoch        1.311e-02  7.392e-03   1.774   0.0774 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 39.53 on 223 degrees of freedom
Multiple R-squared:  0.03151,   Adjusted R-squared:  0.01414 
F-statistic: 1.814 on 4 and 223 DF,  p-value: 0.1271

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' RANTES_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: RANTES_rank 
Effect size...............: 6.667753 
Standard error............: 2.932656 
Odds ratio (effect size)..: 786.626 
Lower 95% CI..............: 2.509 
Upper 95% CI..............: 246658.3 
T-value...................: 2.273622 
P-value...................: 0.0239406 
R^2.......................: 0.031508 
Adjusted r^2..............: 0.014136 
Sample size of AE DB......: 623 
Sample size of model......: 228 
Missing data %............: 63.40289 

- processing MIG_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
      27.69  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-35.99 -17.26  -8.55   5.93 414.90 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)
(Intercept)        -40.985877  91.349071  -0.449    0.654
currentDF[, TRAIT]   3.612208   2.811494   1.285    0.200
Age                  0.342073   0.326664   1.047    0.296
Gendermale           4.512213   6.158990   0.733    0.465
ORdate_epoch         0.003351   0.007118   0.471    0.638

Residual standard error: 39.8 on 223 degrees of freedom
Multiple R-squared:  0.01671,   Adjusted R-squared:  -0.0009268 
F-statistic: 0.9475 on 4 and 223 DF,  p-value: 0.4373

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' MIG_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: MIG_rank 
Effect size...............: 3.612208 
Standard error............: 2.811494 
Odds ratio (effect size)..: 37.048 
Lower 95% CI..............: 0.15 
Upper 95% CI..............: 9161.234 
T-value...................: 1.2848 
P-value...................: 0.200195 
R^2.......................: 0.016711 
Adjusted r^2..............: -0.000927 
Sample size of AE DB......: 623 
Sample size of model......: 228 
Missing data %............: 63.40289 

- processing IP10_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
      28.07  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-38.27 -17.56  -6.96   4.73 415.23 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)
(Intercept)        -88.691124  94.061954  -0.943    0.347
currentDF[, TRAIT]   4.227637   2.907662   1.454    0.148
Age                  0.379027   0.355347   1.067    0.287
Gendermale           6.676987   6.485221   1.030    0.304
ORdate_epoch         0.006867   0.007196   0.954    0.341

Residual standard error: 41.12 on 203 degrees of freedom
Multiple R-squared:  0.02242,   Adjusted R-squared:  0.003156 
F-statistic: 1.164 on 4 and 203 DF,  p-value: 0.3279

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' IP10_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: IP10_rank 
Effect size...............: 4.227637 
Standard error............: 2.907662 
Odds ratio (effect size)..: 68.555 
Lower 95% CI..............: 0.23 
Upper 95% CI..............: 20468.74 
T-value...................: 1.453965 
P-value...................: 0.1475004 
R^2.......................: 0.022418 
Adjusted r^2..............: 0.003156 
Sample size of AE DB......: 623 
Sample size of model......: 208 
Missing data %............: 66.61316 

- processing Eotaxin1_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
      27.62  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-30.85 -17.40  -8.06   4.77 415.06 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)
(Intercept)        -67.733793  88.636854  -0.764    0.446
currentDF[, TRAIT]   0.637212   2.656733   0.240    0.811
Age                  0.265744   0.320851   0.828    0.408
Gendermale           4.525922   6.084902   0.744    0.458
ORdate_epoch         0.005887   0.006831   0.862    0.390

Residual standard error: 39.65 on 227 degrees of freedom
Multiple R-squared:  0.008999,  Adjusted R-squared:  -0.008463 
F-statistic: 0.5154 on 4 and 227 DF,  p-value: 0.7245

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' Eotaxin1_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: Eotaxin1_rank 
Effect size...............: 0.637212 
Standard error............: 2.656733 
Odds ratio (effect size)..: 1.891 
Lower 95% CI..............: 0.01 
Upper 95% CI..............: 345.298 
T-value...................: 0.239848 
P-value...................: 0.8106645 
R^2.......................: 0.008999 
Adjusted r^2..............: -0.008463 
Sample size of AE DB......: 623 
Sample size of model......: 232 
Missing data %............: 62.76084 

- processing TARC_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Coefficients:
       (Intercept)  currentDF[, TRAIT]                 Age          Gendermale        ORdate_epoch  
        -207.95042             6.38764             0.58156            10.11123             0.01498  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-43.88 -18.26  -7.27   6.04 405.52 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)  
(Intercept)        -2.080e+02  1.153e+02  -1.803   0.0729 .
currentDF[, TRAIT]  6.388e+00  3.113e+00   2.052   0.0415 *
Age                 5.816e-01  3.580e-01   1.624   0.1059  
Gendermale          1.011e+01  6.731e+00   1.502   0.1346  
ORdate_epoch        1.498e-02  8.688e-03   1.724   0.0862 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 41.02 on 200 degrees of freedom
Multiple R-squared:  0.03995,   Adjusted R-squared:  0.02075 
F-statistic: 2.081 on 4 and 200 DF,  p-value: 0.0847

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' TARC_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: TARC_rank 
Effect size...............: 6.387643 
Standard error............: 3.112859 
Odds ratio (effect size)..: 594.454 
Lower 95% CI..............: 1.332 
Upper 95% CI..............: 265361 
T-value...................: 2.052018 
P-value...................: 0.04147065 
R^2.......................: 0.039951 
Adjusted r^2..............: 0.02075 
Sample size of AE DB......: 623 
Sample size of model......: 205 
Missing data %............: 67.0947 

- processing PARC_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
      27.62  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-35.42 -18.48  -6.53   4.32 414.90 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)
(Intercept)        -1.131e+02  9.298e+01  -1.217    0.225
currentDF[, TRAIT]  3.700e+00  2.769e+00   1.336    0.183
Age                 2.912e-01  3.198e-01   0.910    0.364
Gendermale          5.358e+00  6.058e+00   0.884    0.377
ORdate_epoch        9.316e-03  7.127e-03   1.307    0.192

Residual standard error: 39.5 on 227 degrees of freedom
Multiple R-squared:  0.01648,   Adjusted R-squared:  -0.000846 
F-statistic: 0.9512 on 4 and 227 DF,  p-value: 0.4352

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' PARC_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: PARC_rank 
Effect size...............: 3.700443 
Standard error............: 2.769259 
Odds ratio (effect size)..: 40.465 
Lower 95% CI..............: 0.178 
Upper 95% CI..............: 9211.343 
T-value...................: 1.336257 
P-value...................: 0.1828032 
R^2.......................: 0.016485 
Adjusted r^2..............: -0.000846 
Sample size of AE DB......: 623 
Sample size of model......: 232 
Missing data %............: 62.76084 

- processing MDC_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
      28.08  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-32.41 -18.45  -7.98   5.56 414.21 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)
(Intercept)        -89.676560  96.537106  -0.929    0.354
currentDF[, TRAIT]   1.866291   2.944837   0.634    0.527
Age                  0.295105   0.341712   0.864    0.389
Gendermale           6.407479   6.464388   0.991    0.323
ORdate_epoch         0.007399   0.007388   1.001    0.318

Residual standard error: 40.78 on 211 degrees of freedom
Multiple R-squared:  0.01235,   Adjusted R-squared:  -0.006375 
F-statistic: 0.6595 on 4 and 211 DF,  p-value: 0.6208

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' MDC_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: MDC_rank 
Effect size...............: 1.866291 
Standard error............: 2.944837 
Odds ratio (effect size)..: 6.464 
Lower 95% CI..............: 0.02 
Upper 95% CI..............: 2075.945 
T-value...................: 0.63375 
P-value...................: 0.5269302 
R^2.......................: 0.012348 
Adjusted r^2..............: -0.006375 
Sample size of AE DB......: 623 
Sample size of model......: 216 
Missing data %............: 65.32905 

- processing OPG_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
      27.62  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-36.57 -18.10  -7.00   5.11 409.72 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)
(Intercept)        -68.605300  87.417842  -0.785    0.433
currentDF[, TRAIT]   3.521328   2.625900   1.341    0.181
Age                  0.314745   0.321536   0.979    0.329
Gendermale           4.305097   6.041532   0.713    0.477
ORdate_epoch         0.005705   0.006728   0.848    0.397

Residual standard error: 39.5 on 227 degrees of freedom
Multiple R-squared:  0.01654,   Adjusted R-squared:  -0.0007905 
F-statistic: 0.9544 on 4 and 227 DF,  p-value: 0.4334

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' OPG_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: OPG_rank 
Effect size...............: 3.521328 
Standard error............: 2.6259 
Odds ratio (effect size)..: 33.829 
Lower 95% CI..............: 0.197 
Upper 95% CI..............: 5814.395 
T-value...................: 1.340999 
P-value...................: 0.1812611 
R^2.......................: 0.016539 
Adjusted r^2..............: -0.00079 
Sample size of AE DB......: 623 
Sample size of model......: 232 
Missing data %............: 62.76084 

- processing sICAM1_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
      27.62  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-29.48 -18.25  -8.39   5.43 413.01 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)
(Intercept)        -56.874414  90.268329  -0.630    0.529
currentDF[, TRAIT]  -1.741154   2.698161  -0.645    0.519
Age                  0.229442   0.323729   0.709    0.479
Gendermale           4.463217   6.061762   0.736    0.462
ORdate_epoch         0.005222   0.006891   0.758    0.449

Residual standard error: 39.62 on 227 degrees of freedom
Multiple R-squared:  0.01056,   Adjusted R-squared:  -0.006872 
F-statistic: 0.6059 on 4 and 227 DF,  p-value: 0.6588

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' sICAM1_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: sICAM1_rank 
Effect size...............: -1.741154 
Standard error............: 2.698161 
Odds ratio (effect size)..: 0.175 
Lower 95% CI..............: 0.001 
Upper 95% CI..............: 34.717 
T-value...................: -0.645311 
P-value...................: 0.5193772 
R^2.......................: 0.010563 
Adjusted r^2..............: -0.006872 
Sample size of AE DB......: 623 
Sample size of model......: 232 
Missing data %............: 62.76084 

- processing VEGFA_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
      26.64  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-28.190 -16.572  -6.075   5.838 216.764 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)
(Intercept)        36.971813  78.220186   0.473    0.637
currentDF[, TRAIT]  1.322838   2.314499   0.572    0.568
Age                 0.286058   0.256517   1.115    0.266
Gendermale          1.950015   4.785744   0.407    0.684
ORdate_epoch       -0.002481   0.006148  -0.404    0.687

Residual standard error: 29.39 on 196 degrees of freedom
Multiple R-squared:  0.008052,  Adjusted R-squared:  -0.01219 
F-statistic: 0.3977 on 4 and 196 DF,  p-value: 0.8101

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' VEGFA_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: VEGFA_rank 
Effect size...............: 1.322838 
Standard error............: 2.314499 
Odds ratio (effect size)..: 3.754 
Lower 95% CI..............: 0.04 
Upper 95% CI..............: 350.464 
T-value...................: 0.571544 
P-value...................: 0.5682857 
R^2.......................: 0.008052 
Adjusted r^2..............: -0.012192 
Sample size of AE DB......: 623 
Sample size of model......: 201 
Missing data %............: 67.73676 

- processing TGFB_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
      28.02  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-30.46 -17.82  -8.26   6.26 413.09 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)
(Intercept)        -72.077478  88.729581  -0.812    0.417
currentDF[, TRAIT]   1.362029   2.668677   0.510    0.610
Age                  0.304434   0.321734   0.946    0.345
Gendermale           3.619179   5.995656   0.604    0.547
ORdate_epoch         0.006116   0.006843   0.894    0.372

Residual standard error: 39.69 on 227 degrees of freedom
Multiple R-squared:  0.009079,  Adjusted R-squared:  -0.008382 
F-statistic: 0.5199 on 4 and 227 DF,  p-value: 0.7212

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' TGFB_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: TGFB_rank 
Effect size...............: 1.362029 
Standard error............: 2.668677 
Odds ratio (effect size)..: 3.904 
Lower 95% CI..............: 0.021 
Upper 95% CI..............: 729.701 
T-value...................: 0.510376 
P-value...................: 0.6102839 
R^2.......................: 0.009079 
Adjusted r^2..............: -0.008382 
Sample size of AE DB......: 623 
Sample size of model......: 232 
Missing data %............: 62.76084 

- processing MMP2_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
      25.63  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-27.299 -16.616  -4.536   6.204 220.831 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)
(Intercept)        64.470511  62.856489   1.026    0.306
currentDF[, TRAIT] -1.982845   1.871456  -1.060    0.290
Age                 0.092582   0.223660   0.414    0.679
Gendermale          1.002118   4.231221   0.237    0.813
ORdate_epoch       -0.003663   0.004885  -0.750    0.454

Residual standard error: 27.73 on 228 degrees of freedom
Multiple R-squared:  0.008214,  Adjusted R-squared:  -0.009185 
F-statistic: 0.4721 on 4 and 228 DF,  p-value: 0.7562

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' MMP2_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: MMP2_rank 
Effect size...............: -1.982845 
Standard error............: 1.871456 
Odds ratio (effect size)..: 0.138 
Lower 95% CI..............: 0.004 
Upper 95% CI..............: 5.394 
T-value...................: -1.05952 
P-value...................: 0.2904841 
R^2.......................: 0.008214 
Adjusted r^2..............: -0.009185 
Sample size of AE DB......: 623 
Sample size of model......: 233 
Missing data %............: 62.60032 

- processing MMP8_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT], data = currentDF)

Coefficients:
       (Intercept)  currentDF[, TRAIT]  
            25.631               2.588  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-29.511 -16.059  -4.482   5.497 221.011 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)
(Intercept)        54.875294  61.810526   0.888    0.376
currentDF[, TRAIT]  2.581427   1.830146   1.411    0.160
Age                 0.120985   0.222350   0.544    0.587
Gendermale          1.054754   4.196582   0.251    0.802
ORdate_epoch       -0.003054   0.004824  -0.633    0.527

Residual standard error: 27.68 on 228 degrees of freedom
Multiple R-squared:  0.01195,   Adjusted R-squared:  -0.005381 
F-statistic: 0.6896 on 4 and 228 DF,  p-value: 0.5999

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' MMP8_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: MMP8_rank 
Effect size...............: 2.581427 
Standard error............: 1.830146 
Odds ratio (effect size)..: 13.216 
Lower 95% CI..............: 0.366 
Upper 95% CI..............: 477.475 
T-value...................: 1.410503 
P-value...................: 0.159754 
R^2.......................: 0.011953 
Adjusted r^2..............: -0.005381 
Sample size of AE DB......: 623 
Sample size of model......: 233 
Missing data %............: 62.60032 

- processing MMP9_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT], data = currentDF)

Coefficients:
       (Intercept)  currentDF[, TRAIT]  
            25.631               2.675  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-29.540 -16.010  -5.057   5.432 219.633 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)
(Intercept)        44.113657  62.089220   0.710    0.478
currentDF[, TRAIT]  2.632786   1.827045   1.441    0.151
Age                 0.122384   0.222328   0.550    0.583
Gendermale          1.787112   4.171002   0.428    0.669
ORdate_epoch       -0.002246   0.004844  -0.464    0.643

Residual standard error: 27.67 on 228 degrees of freedom
Multiple R-squared:  0.01233,   Adjusted R-squared:  -0.005001 
F-statistic: 0.7114 on 4 and 228 DF,  p-value: 0.5849

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' MMP9_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: MMP9_rank 
Effect size...............: 2.632786 
Standard error............: 1.827045 
Odds ratio (effect size)..: 13.912 
Lower 95% CI..............: 0.387 
Upper 95% CI..............: 499.593 
T-value...................: 1.441008 
P-value...................: 0.1509543 
R^2.......................: 0.012326 
Adjusted r^2..............: -0.005001 
Sample size of AE DB......: 623 
Sample size of model......: 233 
Missing data %............: 62.60032 
cat("Edit the column names...\n")
Edit the column names...
colnames(GLM.results) = c("Dataset", "Predictor", "Trait",
                          "Beta", "s.e.m.",
                          "OR", "low95CI", "up95CI",
                          "T-value", "P-value", "r^2", "r^2_adj", "N", "Model_N", "Perc_Miss")

cat("Correct the variable types...\n")
Correct the variable types...
GLM.results$Beta <- as.numeric(GLM.results$Beta)
GLM.results$s.e.m. <- as.numeric(GLM.results$s.e.m.)
GLM.results$OR <- as.numeric(GLM.results$OR)
GLM.results$low95CI <- as.numeric(GLM.results$low95CI)
GLM.results$up95CI <- as.numeric(GLM.results$up95CI)
GLM.results$`T-value` <- as.numeric(GLM.results$`T-value`)
GLM.results$`P-value` <- as.numeric(GLM.results$`P-value`)
GLM.results$`r^2` <- as.numeric(GLM.results$`r^2`)
GLM.results$`r^2_adj` <- as.numeric(GLM.results$`r^2_adj`)
GLM.results$`N` <- as.numeric(GLM.results$`N`)
GLM.results$`Model_N` <- as.numeric(GLM.results$`Model_N`)
GLM.results$`Perc_Miss` <- as.numeric(GLM.results$`Perc_Miss`)
DT::datatable(GLM.results)

# Save the data
cat("Writing results to Excel-file...\n")
Writing results to Excel-file...
### Univariate
library(openxlsx)
write.xlsx(GLM.results,
           file = paste0(OUT_loc, "/",Today,".AERNASE.clin.hdac9.Con.Uni.",TRAIT_OF_INTEREST,"_Plaque.Cytokines_Plaques.RANK.MODEL1.xlsx"),
           rowNmes = FALSE, colNames = TRUE, sheetName = "Con.Uni.PlaquePheno")
# Removing intermediates
cat("Removing intermediate files...\n")
Removing intermediate files...
rm(TRAIT, trait, currentDF, GLM.results, GLM.results.TEMP, fit, model_step)

Model 2

In this model we correct for Age, Gender, year of surgery, Hypertension status, Diabetes status, current smoker status, lipid-lowering drugs (LLDs), antiplatelet medication, eGFR (MDRD), BMI, MedHx_CVD (combination of CAD history, stroke history, and peripheral interventions), and stenosis.

Here we use the inverse-rank normalized data - visually this is more normally distributed.

Analysis of plaque cytokines as a function of plaque target(s) levels.


GLM.results <- data.frame(matrix(NA, ncol = 15, nrow = 0))
cat("Running linear regression...\n")
Running linear regression...
for (protein in 1:length(TRAITS.TARGET.RANK)) {
  PROTEIN = TRAITS.TARGET.RANK[protein]
  cat(paste0("\nAnalysis of ",PROTEIN,".\n"))
  for (trait in 1:length(proteins_of_interest_rank)) {
    TRAIT = proteins_of_interest_rank[trait]
    cat(paste0("\n- processing ",TRAIT,"\n\n"))
    currentDF <- as.data.frame(AERNASE.clin.hdac9 %>%
      dplyr::select(., PROTEIN, TRAIT, COVARIATES_M2) %>%
      filter(complete.cases(.))) %>%
      filter_if(~is.numeric(.), all_vars(!is.infinite(.)))
    # for debug
    # print(DT::datatable(currentDF))
    # print(nrow(currentDF))
    # print(str(currentDF))
    ### univariate
    # fit <- lm(currentDF[,PROTEIN] ~ currentDF[,TRAIT] + Age + Gender + ORdate_year + 
    #             Hypertension.composite + DiabetesStatus + SmokerStatus + 
    #             Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + 
    #             MedHx_CVD + stenose, 
    #           data = currentDF)
    fit <- lm(currentDF[,PROTEIN] ~ currentDF[,TRAIT] + Age + Gender + ORdate_epoch + 
                Hypertension.composite + DiabetesStatus + SmokerStatus + 
                Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + 
                MedHx_CVD + stenose, 
              data = currentDF)
    model_step <- stepAIC(fit, direction = "both", trace = FALSE)
    print(model_step)
    print(summary(fit))
    
    GLM.results.TEMP <- data.frame(matrix(NA, ncol = 15, nrow = 0))
    GLM.results.TEMP[1,] = GLM.CON(fit, "AEDB.CEA", PROTEIN, TRAIT, verbose = TRUE)
    GLM.results = rbind(GLM.results, GLM.results.TEMP)
  }
}

Analysis of HDAC9.

- processing IL2_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ DiabetesStatus, data = currentDF)

Coefficients:
           (Intercept)  DiabetesStatusDiabetes  
                27.239                  -8.647  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-32.169 -14.980  -3.248   8.376 151.803 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)               129.968938  82.983078   1.566   0.1194  
currentDF[, TRAIT]         -3.630311   2.139259  -1.697   0.0918 .
Age                        -0.216849   0.286416  -0.757   0.4502  
Gendermale                  0.869385   5.154359   0.169   0.8663  
ORdate_epoch               -0.005699   0.005899  -0.966   0.3356  
Hypertension.compositeyes   5.520698   6.724909   0.821   0.4130  
DiabetesStatusDiabetes    -10.029463   5.630936  -1.781   0.0769 .
SmokerStatusEx-smoker       4.024371   4.829086   0.833   0.4060  
SmokerStatusNever smoked   -2.370524   6.470277  -0.366   0.7146  
Med.Statin.LLDyes          -6.615329   4.695073  -1.409   0.1609  
Med.all.antiplateletyes    -3.076332   7.510344  -0.410   0.6827  
GFR_MDRD                   -0.069496   0.122784  -0.566   0.5722  
BMI                        -0.540142   0.635367  -0.850   0.3966  
MedHx_CVDNo                 1.185006   4.475491   0.265   0.7915  
stenose70-90%               3.765984  19.200092   0.196   0.8448  
stenose90-99%               1.901542  19.087538   0.100   0.9208  
stenose100% (Occlusion)   -23.876986  27.789248  -0.859   0.3916  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 25.63 on 148 degrees of freedom
Multiple R-squared:  0.06958,   Adjusted R-squared:  -0.031 
F-statistic: 0.6918 on 16 and 148 DF,  p-value: 0.7988

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' IL2_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: IL2_rank 
Effect size...............: -3.630311 
Standard error............: 2.139259 
Odds ratio (effect size)..: 0.027 
Lower 95% CI..............: 0 
Upper 95% CI..............: 1.755 
T-value...................: -1.696995 
P-value...................: 0.09179966 
R^2.......................: 0.069581 
Adjusted r^2..............: -0.031005 
Sample size of AE DB......: 623 
Sample size of model......: 165 
Missing data %............: 73.51525 

- processing IL4_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ DiabetesStatus + GFR_MDRD, 
    data = currentDF)

Coefficients:
           (Intercept)  DiabetesStatusDiabetes                GFR_MDRD  
               47.7846                -13.4243                 -0.2586  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-32.858 -17.385  -4.113   5.693 201.916 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)                9.768e+01  1.144e+02   0.854   0.3949  
currentDF[, TRAIT]        -8.615e-01  2.942e+00  -0.293   0.7701  
Age                       -2.347e-01  3.866e-01  -0.607   0.5448  
Gendermale                 5.040e+00  6.905e+00   0.730   0.4668  
ORdate_epoch              -8.409e-04  8.188e-03  -0.103   0.9184  
Hypertension.compositeyes  7.289e+00  9.096e+00   0.801   0.4244  
DiabetesStatusDiabetes    -1.427e+01  7.554e+00  -1.888   0.0612 .
SmokerStatusEx-smoker     -5.237e-01  6.313e+00  -0.083   0.9340  
SmokerStatusNever smoked  -5.638e+00  8.802e+00  -0.641   0.5229  
Med.Statin.LLDyes         -6.647e+00  6.569e+00  -1.012   0.3135  
Med.all.antiplateletyes   -3.736e+00  9.932e+00  -0.376   0.7074  
GFR_MDRD                  -2.673e-01  1.791e-01  -1.492   0.1381  
BMI                       -9.417e-01  8.967e-01  -1.050   0.2956  
MedHx_CVDNo                6.568e+00  6.007e+00   1.094   0.2762  
stenose70-90%              5.456e-01  2.450e+01   0.022   0.9823  
stenose90-99%             -1.560e+00  2.432e+01  -0.064   0.9489  
stenose100% (Occlusion)   -3.036e+01  3.552e+01  -0.855   0.3942  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 32.3 on 130 degrees of freedom
Multiple R-squared:  0.07954,   Adjusted R-squared:  -0.03375 
F-statistic: 0.7021 on 16 and 130 DF,  p-value: 0.7877

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' IL4_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: IL4_rank 
Effect size...............: -0.861483 
Standard error............: 2.942255 
Odds ratio (effect size)..: 0.423 
Lower 95% CI..............: 0.001 
Upper 95% CI..............: 135.009 
T-value...................: -0.292797 
P-value...................: 0.7701444 
R^2.......................: 0.079542 
Adjusted r^2..............: -0.033746 
Sample size of AE DB......: 623 
Sample size of model......: 147 
Missing data %............: 76.40449 

- processing IL5_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
      26.92  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-37.693 -16.052  -4.689   5.941 204.877 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)
(Intercept)               117.047668 104.499037   1.120    0.265
currentDF[, TRAIT]         -3.245108   2.655469  -1.222    0.224
Age                        -0.138915   0.368401  -0.377    0.707
Gendermale                  5.258030   6.431434   0.818    0.415
ORdate_epoch               -0.004975   0.007600  -0.655    0.514
Hypertension.compositeyes   6.221788   8.538623   0.729    0.467
DiabetesStatusDiabetes    -10.444662   6.934794  -1.506    0.134
SmokerStatusEx-smoker      -1.924986   5.869640  -0.328    0.743
SmokerStatusNever smoked   -8.234699   8.322618  -0.989    0.324
Med.Statin.LLDyes          -3.648396   5.989365  -0.609    0.543
Med.all.antiplateletyes    -1.858734   9.344854  -0.199    0.843
GFR_MDRD                   -0.139730   0.159391  -0.877    0.382
BMI                        -0.710326   0.789321  -0.900    0.370
MedHx_CVDNo                 7.238149   5.675679   1.275    0.204
stenose70-90%               7.280024  19.713996   0.369    0.712
stenose90-99%               6.070692  19.481112   0.312    0.756
stenose100% (Occlusion)   -22.734645  31.469828  -0.722    0.471

Residual standard error: 31.55 on 143 degrees of freedom
Multiple R-squared:  0.0636,    Adjusted R-squared:  -0.04117 
F-statistic: 0.607 on 16 and 143 DF,  p-value: 0.8743

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' IL5_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: IL5_rank 
Effect size...............: -3.245108 
Standard error............: 2.655469 
Odds ratio (effect size)..: 0.039 
Lower 95% CI..............: 0 
Upper 95% CI..............: 7.097 
T-value...................: -1.222047 
P-value...................: 0.2237004 
R^2.......................: 0.063602 
Adjusted r^2..............: -0.04117 
Sample size of AE DB......: 623 
Sample size of model......: 160 
Missing data %............: 74.31782 

- processing IL6_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ 1, data = currentDF)

Coefficients:
(Intercept)  
       26.7  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-31.819 -15.990  -5.261   5.452 210.089 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)
(Intercept)                61.035488 105.244620   0.580    0.563
currentDF[, TRAIT]         -2.457169   2.513783  -0.977    0.330
Age                        -0.125314   0.368737  -0.340    0.734
Gendermale                  2.795241   6.075628   0.460    0.646
ORdate_epoch               -0.002174   0.006981  -0.311    0.756
Hypertension.compositeyes   5.565669   8.135875   0.684    0.495
DiabetesStatusDiabetes     -9.566689   6.796799  -1.408    0.161
SmokerStatusEx-smoker      -0.146312   5.839922  -0.025    0.980
SmokerStatusNever smoked   -6.833897   7.973191  -0.857    0.393
Med.Statin.LLDyes          -2.705923   5.696006  -0.475    0.635
Med.all.antiplateletyes    -3.818322   9.321445  -0.410    0.683
GFR_MDRD                   -0.181739   0.156203  -1.163    0.247
BMI                        -0.099018   0.670927  -0.148    0.883
MedHx_CVDNo                 5.896464   5.465876   1.079    0.282
stenose50-70%               9.993737  37.564923   0.266    0.791
stenose70-90%              16.110172  32.631375   0.494    0.622
stenose90-99%              15.843750  32.573331   0.486    0.627
stenose100% (Occlusion)    -6.135593  41.121254  -0.149    0.882

Residual standard error: 31.32 on 148 degrees of freedom
Multiple R-squared:  0.05049,   Adjusted R-squared:  -0.05857 
F-statistic: 0.463 on 17 and 148 DF,  p-value: 0.9654

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' IL6_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: IL6_rank 
Effect size...............: -2.457169 
Standard error............: 2.513783 
Odds ratio (effect size)..: 0.086 
Lower 95% CI..............: 0.001 
Upper 95% CI..............: 11.821 
T-value...................: -0.977479 
P-value...................: 0.3299273 
R^2.......................: 0.050493 
Adjusted r^2..............: -0.058572 
Sample size of AE DB......: 623 
Sample size of model......: 166 
Missing data %............: 73.35474 

- processing IL8_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ DiabetesStatus + GFR_MDRD, 
    data = currentDF)

Coefficients:
           (Intercept)  DiabetesStatusDiabetes                GFR_MDRD  
                47.349                  -9.874                  -0.277  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-36.181 -14.386  -4.350   7.589 203.858 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)                70.768721 104.295273   0.679   0.4986  
currentDF[, TRAIT]          1.304865   2.520518   0.518   0.6055  
Age                        -0.266970   0.341119  -0.783   0.4352  
Gendermale                  0.109966   6.090895   0.018   0.9856  
ORdate_epoch               -0.001114   0.006942  -0.161   0.8727  
Hypertension.compositeyes   4.103920   7.555310   0.543   0.5879  
DiabetesStatusDiabetes    -11.400345   6.400173  -1.781   0.0771 .
SmokerStatusEx-smoker      -1.028139   5.718107  -0.180   0.8576  
SmokerStatusNever smoked   -6.831397   8.229451  -0.830   0.4079  
Med.Statin.LLDyes          -3.857459   5.475895  -0.704   0.4824  
Med.all.antiplateletyes    -2.293451   8.436622  -0.272   0.7862  
GFR_MDRD                   -0.337771   0.134928  -2.503   0.0135 *
BMI                        -0.110912   0.644698  -0.172   0.8637  
MedHx_CVDNo                 7.303814   5.337681   1.368   0.1735  
stenose50-70%              14.911972  34.954356   0.427   0.6703  
stenose70-90%              12.926699  30.526721   0.423   0.6726  
stenose90-99%              17.794668  30.415685   0.585   0.5595  
stenose100% (Occlusion)    -4.196833  43.423601  -0.097   0.9231  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 29.18 on 136 degrees of freedom
Multiple R-squared:  0.08425,   Adjusted R-squared:  -0.03021 
F-statistic: 0.736 on 17 and 136 DF,  p-value: 0.7614

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' IL8_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: IL8_rank 
Effect size...............: 1.304865 
Standard error............: 2.520518 
Odds ratio (effect size)..: 3.687 
Lower 95% CI..............: 0.026 
Upper 95% CI..............: 515.471 
T-value...................: 0.517697 
P-value...................: 0.6055106 
R^2.......................: 0.084254 
Adjusted r^2..............: -0.030215 
Sample size of AE DB......: 623 
Sample size of model......: 154 
Missing data %............: 75.2809 

- processing IL9_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Hypertension.composite + 
    MedHx_CVD, data = currentDF)

Coefficients:
              (Intercept)         currentDF[, TRAIT]  Hypertension.compositeyes                MedHx_CVDNo  
                   12.272                      4.523                     13.449                     11.345  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-46.45 -19.40  -6.21   7.60 392.54 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)               -1.037e+02  1.274e+02  -0.814   0.4169  
currentDF[, TRAIT]         5.515e+00  3.203e+00   1.722   0.0869 .
Age                        4.228e-01  4.673e-01   0.905   0.3669  
Gendermale                 7.743e+00  7.745e+00   1.000   0.3189  
ORdate_epoch               5.362e-03  8.325e-03   0.644   0.5204  
Hypertension.compositeyes  1.395e+01  1.047e+01   1.333   0.1844  
DiabetesStatusDiabetes    -1.138e+01  8.657e+00  -1.315   0.1903  
SmokerStatusEx-smoker     -1.074e+01  7.569e+00  -1.419   0.1578  
SmokerStatusNever smoked  -1.851e+01  9.639e+00  -1.921   0.0564 .
Med.Statin.LLDyes          3.855e+00  7.599e+00   0.507   0.6125  
Med.all.antiplateletyes   -2.816e+00  1.264e+01  -0.223   0.8240  
GFR_MDRD                  -1.518e-01  1.758e-01  -0.863   0.3893  
BMI                        3.090e-01  8.496e-01   0.364   0.7165  
MedHx_CVDNo                1.408e+01  6.996e+00   2.013   0.0457 *
stenose50-70%              1.401e+00  5.447e+01   0.026   0.9795  
stenose70-90%              2.645e+01  4.414e+01   0.599   0.5498  
stenose90-99%              2.485e+01  4.395e+01   0.565   0.5726  
stenose100% (Occlusion)    1.655e+01  5.590e+01   0.296   0.7676  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 42.7 on 169 degrees of freedom
Multiple R-squared:  0.08693,   Adjusted R-squared:  -0.004922 
F-statistic: 0.9464 on 17 and 169 DF,  p-value: 0.5211

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' IL9_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: IL9_rank 
Effect size...............: 5.515299 
Standard error............: 3.203045 
Odds ratio (effect size)..: 248.464 
Lower 95% CI..............: 0.466 
Upper 95% CI..............: 132358.2 
T-value...................: 1.721893 
P-value...................: 0.08691863 
R^2.......................: 0.086926 
Adjusted r^2..............: -0.004922 
Sample size of AE DB......: 623 
Sample size of model......: 187 
Missing data %............: 69.98395 

- processing IL10_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ DiabetesStatus, data = currentDF)

Coefficients:
           (Intercept)  DiabetesStatusDiabetes  
                 27.19                  -12.37  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-34.698 -15.064  -4.186   7.093 155.652 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)               152.940977 103.255497   1.481   0.1411  
currentDF[, TRAIT]         -1.610936   2.496055  -0.645   0.5199  
Age                        -0.208530   0.335881  -0.621   0.5358  
Gendermale                  1.648079   5.928065   0.278   0.7815  
ORdate_epoch               -0.007795   0.007208  -1.081   0.2816  
Hypertension.compositeyes   3.913896   7.856162   0.498   0.6192  
DiabetesStatusDiabetes    -11.971242   6.484907  -1.846   0.0673 .
SmokerStatusEx-smoker       3.104410   5.486883   0.566   0.5726  
SmokerStatusNever smoked   -0.393869   7.507139  -0.052   0.9582  
Med.Statin.LLDyes          -7.210981   5.428428  -1.328   0.1865  
Med.all.antiplateletyes    -2.707332   8.493664  -0.319   0.7505  
GFR_MDRD                   -0.080901   0.154891  -0.522   0.6024  
BMI                        -0.380631   0.763865  -0.498   0.6192  
MedHx_CVDNo                 1.032071   5.363695   0.192   0.8477  
stenose70-90%               3.997997  20.755707   0.193   0.8476  
stenose90-99%               0.575526  20.599537   0.028   0.9778  
stenose100% (Occlusion)   -24.470011  30.112107  -0.813   0.4180  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 27.28 on 124 degrees of freedom
Multiple R-squared:  0.0718,    Adjusted R-squared:  -0.04797 
F-statistic: 0.5995 on 16 and 124 DF,  p-value: 0.8793

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' IL10_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: IL10_rank 
Effect size...............: -1.610936 
Standard error............: 2.496055 
Odds ratio (effect size)..: 0.2 
Lower 95% CI..............: 0.001 
Upper 95% CI..............: 26.611 
T-value...................: -0.645393 
P-value...................: 0.5198651 
R^2.......................: 0.071797 
Adjusted r^2..............: -0.047971 
Sample size of AE DB......: 623 
Sample size of model......: 141 
Missing data %............: 77.36758 

- processing IL12_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ DiabetesStatus, data = currentDF)

Coefficients:
           (Intercept)  DiabetesStatusDiabetes  
                 30.08                  -12.16  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-41.843 -17.184  -5.674   7.406 199.835 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)               109.081829 119.358629   0.914   0.3624  
currentDF[, TRAIT]         -3.747386   2.895094  -1.294   0.1978  
Age                        -0.169678   0.399571  -0.425   0.6718  
Gendermale                  5.644918   6.860809   0.823   0.4121  
ORdate_epoch               -0.002681   0.008285  -0.324   0.7468  
Hypertension.compositeyes   7.127322   9.353193   0.762   0.4474  
DiabetesStatusDiabetes    -12.919779   7.441690  -1.736   0.0849 .
SmokerStatusEx-smoker      -3.107886   6.616386  -0.470   0.6393  
SmokerStatusNever smoked   -9.175993   8.624990  -1.064   0.2893  
Med.Statin.LLDyes          -6.169667   6.512821  -0.947   0.3452  
Med.all.antiplateletyes    -3.602165   9.995524  -0.360   0.7191  
GFR_MDRD                   -0.163398   0.175801  -0.929   0.3544  
BMI                        -0.942798   0.889289  -1.060   0.2910  
MedHx_CVDNo                 5.208424   6.009919   0.867   0.3877  
stenose70-90%               2.097430  24.493718   0.086   0.9319  
stenose90-99%              -0.292415  24.409199  -0.012   0.9905  
stenose100% (Occlusion)   -30.015971  42.905802  -0.700   0.4854  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 32.37 on 131 degrees of freedom
Multiple R-squared:  0.07539,   Adjusted R-squared:  -0.03755 
F-statistic: 0.6675 on 16 and 131 DF,  p-value: 0.8213

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' IL12_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: IL12_rank 
Effect size...............: -3.747386 
Standard error............: 2.895094 
Odds ratio (effect size)..: 0.024 
Lower 95% CI..............: 0 
Upper 95% CI..............: 6.869 
T-value...................: -1.294392 
P-value...................: 0.1978072 
R^2.......................: 0.075385 
Adjusted r^2..............: -0.037545 
Sample size of AE DB......: 623 
Sample size of model......: 148 
Missing data %............: 76.24398 

- processing IL13_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Hypertension.composite + SmokerStatus + MedHx_CVD, data = currentDF)

Coefficients:
              (Intercept)         currentDF[, TRAIT]                        Age  Hypertension.compositeyes      SmokerStatusEx-smoker  
                  -22.894                      5.055                      0.632                     12.210                     -9.777  
 SmokerStatusNever smoked                MedHx_CVDNo  
                  -17.437                     12.669  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-46.10 -18.81  -7.42   7.90 393.71 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)               -1.005e+02  1.207e+02  -0.832   0.4062  
currentDF[, TRAIT]         4.207e+00  3.096e+00   1.359   0.1759  
Age                        4.975e-01  4.299e-01   1.157   0.2486  
Gendermale                 7.052e+00  7.203e+00   0.979   0.3289  
ORdate_epoch               5.358e-03  7.986e-03   0.671   0.5031  
Hypertension.compositeyes  1.021e+01  9.420e+00   1.083   0.2800  
DiabetesStatusDiabetes    -1.056e+01  7.794e+00  -1.355   0.1769  
SmokerStatusEx-smoker     -1.121e+01  7.033e+00  -1.594   0.1126  
SmokerStatusNever smoked  -1.824e+01  9.071e+00  -2.011   0.0458 *
Med.Statin.LLDyes          2.851e+00  6.932e+00   0.411   0.6814  
Med.all.antiplateletyes   -4.766e+00  1.088e+01  -0.438   0.6619  
GFR_MDRD                  -1.358e-01  1.660e-01  -0.818   0.4145  
BMI                        3.189e-01  7.766e-01   0.411   0.6818  
MedHx_CVDNo                1.219e+01  6.359e+00   1.917   0.0567 .
stenose50-70%              1.402e+01  4.944e+01   0.284   0.7770  
stenose70-90%              2.285e+01  4.280e+01   0.534   0.5940  
stenose90-99%              2.212e+01  4.275e+01   0.517   0.6056  
stenose100% (Occlusion)    1.013e+01  5.360e+01   0.189   0.8503  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 41.41 on 186 degrees of freedom
Multiple R-squared:  0.0741,    Adjusted R-squared:  -0.01053 
F-statistic: 0.8756 on 17 and 186 DF,  p-value: 0.6035

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' IL13_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: IL13_rank 
Effect size...............: 4.206555 
Standard error............: 3.09586 
Odds ratio (effect size)..: 67.125 
Lower 95% CI..............: 0.155 
Upper 95% CI..............: 28982.27 
T-value...................: 1.358768 
P-value...................: 0.1758656 
R^2.......................: 0.0741 
Adjusted r^2..............: -0.010525 
Sample size of AE DB......: 623 
Sample size of model......: 204 
Missing data %............: 67.25522 

- processing IL21_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ MedHx_CVD, data = currentDF)

Coefficients:
(Intercept)  MedHx_CVDNo  
      24.31        10.03  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-42.28 -18.89  -7.44   6.63 394.89 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)               -1.034e+02  1.210e+02  -0.855   0.3937  
currentDF[, TRAIT]         3.043e+00  3.074e+00   0.990   0.3234  
Age                        4.429e-01  4.268e-01   1.038   0.3008  
Gendermale                 7.166e+00  7.234e+00   0.991   0.3232  
ORdate_epoch               5.891e-03  7.984e-03   0.738   0.4616  
Hypertension.compositeyes  9.563e+00  9.418e+00   1.015   0.3112  
DiabetesStatusDiabetes    -1.094e+01  7.802e+00  -1.403   0.1624  
SmokerStatusEx-smoker     -1.051e+01  7.009e+00  -1.499   0.1354  
SmokerStatusNever smoked  -1.741e+01  9.053e+00  -1.923   0.0560 .
Med.Statin.LLDyes          2.957e+00  6.955e+00   0.425   0.6712  
Med.all.antiplateletyes   -4.815e+00  1.091e+01  -0.441   0.6596  
GFR_MDRD                  -1.435e-01  1.663e-01  -0.863   0.3891  
BMI                        2.841e-01  7.778e-01   0.365   0.7154  
MedHx_CVDNo                1.201e+01  6.371e+00   1.886   0.0609 .
stenose50-70%              1.642e+01  4.950e+01   0.332   0.7404  
stenose70-90%              2.426e+01  4.288e+01   0.566   0.5723  
stenose90-99%              2.394e+01  4.283e+01   0.559   0.5768  
stenose100% (Occlusion)    9.047e+00  5.373e+01   0.168   0.8665  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 41.5 on 186 degrees of freedom
Multiple R-squared:  0.06981,   Adjusted R-squared:  -0.01521 
F-statistic: 0.8211 on 17 and 186 DF,  p-value: 0.6674

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' IL21_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: IL21_rank 
Effect size...............: 3.043012 
Standard error............: 3.073602 
Odds ratio (effect size)..: 20.968 
Lower 95% CI..............: 0.051 
Upper 95% CI..............: 8666.942 
T-value...................: 0.990048 
P-value...................: 0.323437 
R^2.......................: 0.069811 
Adjusted r^2..............: -0.015206 
Sample size of AE DB......: 623 
Sample size of model......: 204 
Missing data %............: 67.25522 

- processing INFG_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ DiabetesStatus + GFR_MDRD, 
    data = currentDF)

Coefficients:
           (Intercept)  DiabetesStatusDiabetes                GFR_MDRD  
                46.116                 -10.540                  -0.229  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-37.052 -16.810  -6.036   4.841 204.684 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)                3.083e+01  1.162e+02   0.265   0.7911  
currentDF[, TRAIT]        -8.858e-01  3.003e+00  -0.295   0.7684  
Age                       -1.379e-01  3.821e-01  -0.361   0.7187  
Gendermale                 3.317e+00  6.981e+00   0.475   0.6354  
ORdate_epoch               5.428e-04  7.843e-03   0.069   0.9449  
Hypertension.compositeyes  4.378e+00  9.269e+00   0.472   0.6375  
DiabetesStatusDiabetes    -1.173e+01  7.028e+00  -1.669   0.0973 .
SmokerStatusEx-smoker     -7.864e-01  6.341e+00  -0.124   0.9015  
SmokerStatusNever smoked  -5.697e+00  8.465e+00  -0.673   0.5021  
Med.Statin.LLDyes         -3.830e+00  6.203e+00  -0.617   0.5379  
Med.all.antiplateletyes   -1.799e+00  9.179e+00  -0.196   0.8449  
GFR_MDRD                  -2.448e-01  1.541e-01  -1.588   0.1145  
BMI                       -1.435e-01  7.120e-01  -0.202   0.8406  
MedHx_CVDNo                6.153e+00  6.026e+00   1.021   0.3090  
stenose50-70%              1.502e+01  3.880e+01   0.387   0.6994  
stenose70-90%              2.130e+01  3.385e+01   0.629   0.5301  
stenose90-99%              1.978e+01  3.366e+01   0.588   0.5577  
stenose100% (Occlusion)   -2.164e+00  4.783e+01  -0.045   0.9640  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 32.3 on 138 degrees of freedom
Multiple R-squared:  0.05484,   Adjusted R-squared:  -0.06159 
F-statistic: 0.471 on 17 and 138 DF,  p-value: 0.9621

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' INFG_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: INFG_rank 
Effect size...............: -0.885797 
Standard error............: 3.002723 
Odds ratio (effect size)..: 0.412 
Lower 95% CI..............: 0.001 
Upper 95% CI..............: 148.345 
T-value...................: -0.294998 
P-value...................: 0.7684387 
R^2.......................: 0.054838 
Adjusted r^2..............: -0.061595 
Sample size of AE DB......: 623 
Sample size of model......: 156 
Missing data %............: 74.95987 

- processing TNFA_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ DiabetesStatus + GFR_MDRD, 
    data = currentDF)

Coefficients:
           (Intercept)  DiabetesStatusDiabetes                GFR_MDRD  
               45.0253                -14.4089                 -0.2155  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-36.268 -18.091  -3.865   7.017 200.531 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)               117.041754 114.719309   1.020   0.3095  
currentDF[, TRAIT]         -3.011704   2.882297  -1.045   0.2980  
Age                        -0.148370   0.389891  -0.381   0.7042  
Gendermale                  4.288191   6.814393   0.629   0.5303  
ORdate_epoch               -0.002815   0.007968  -0.353   0.7244  
Hypertension.compositeyes   8.726960   9.150317   0.954   0.3420  
DiabetesStatusDiabetes    -14.703110   7.380005  -1.992   0.0484 *
SmokerStatusEx-smoker      -0.663673   6.368894  -0.104   0.9172  
SmokerStatusNever smoked   -7.073530   8.668658  -0.816   0.4160  
Med.Statin.LLDyes          -6.740318   6.498422  -1.037   0.3016  
Med.all.antiplateletyes    -6.869815   9.845985  -0.698   0.4866  
GFR_MDRD                   -0.225237   0.168685  -1.335   0.1841  
BMI                        -0.929990   0.834935  -1.114   0.2674  
MedHx_CVDNo                 4.959465   6.164356   0.805   0.4226  
stenose70-90%              -0.196921  24.403726  -0.008   0.9936  
stenose90-99%              -2.378007  24.165617  -0.098   0.9218  
stenose100% (Occlusion)   -31.350754  42.550894  -0.737   0.4626  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 32.28 on 130 degrees of freedom
Multiple R-squared:  0.08234,   Adjusted R-squared:  -0.0306 
F-statistic: 0.729 on 16 and 130 DF,  p-value: 0.7602

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' TNFA_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: TNFA_rank 
Effect size...............: -3.011704 
Standard error............: 2.882297 
Odds ratio (effect size)..: 0.049 
Lower 95% CI..............: 0 
Upper 95% CI..............: 13.98 
T-value...................: -1.044897 
P-value...................: 0.2980096 
R^2.......................: 0.082341 
Adjusted r^2..............: -0.030602 
Sample size of AE DB......: 623 
Sample size of model......: 147 
Missing data %............: 76.40449 

- processing MIF_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ MedHx_CVD, data = currentDF)

Coefficients:
(Intercept)  MedHx_CVDNo  
      24.31        10.03  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-40.41 -18.87  -7.19   5.81 393.46 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)               -1.245e+02  1.307e+02  -0.952   0.3422  
currentDF[, TRAIT]         8.860e-01  3.564e+00   0.249   0.8039  
Age                        3.822e-01  4.236e-01   0.902   0.3680  
Gendermale                 7.885e+00  7.213e+00   1.093   0.2757  
ORdate_epoch               7.585e-03  8.902e-03   0.852   0.3952  
Hypertension.compositeyes  9.409e+00  9.497e+00   0.991   0.3231  
DiabetesStatusDiabetes    -1.140e+01  7.814e+00  -1.459   0.1464  
SmokerStatusEx-smoker     -9.582e+00  6.999e+00  -1.369   0.1726  
SmokerStatusNever smoked  -1.619e+01  9.001e+00  -1.798   0.0738 .
Med.Statin.LLDyes          3.456e+00  6.958e+00   0.497   0.6200  
Med.all.antiplateletyes   -4.515e+00  1.096e+01  -0.412   0.6808  
GFR_MDRD                  -1.389e-01  1.690e-01  -0.822   0.4119  
BMI                        2.701e-01  7.798e-01   0.346   0.7294  
MedHx_CVDNo                1.183e+01  6.390e+00   1.851   0.0657 .
stenose50-70%              1.956e+01  4.958e+01   0.395   0.6936  
stenose70-90%              2.615e+01  4.304e+01   0.607   0.5443  
stenose90-99%              2.688e+01  4.297e+01   0.625   0.5324  
stenose100% (Occlusion)    9.416e+00  5.391e+01   0.175   0.8615  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 41.61 on 186 degrees of freedom
Multiple R-squared:  0.06522,   Adjusted R-squared:  -0.02022 
F-statistic: 0.7634 on 17 and 186 DF,  p-value: 0.7333

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' MIF_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: MIF_rank 
Effect size...............: 0.886013 
Standard error............: 3.563763 
Odds ratio (effect size)..: 2.425 
Lower 95% CI..............: 0.002 
Upper 95% CI..............: 2620.156 
T-value...................: 0.248617 
P-value...................: 0.8039312 
R^2.......................: 0.06522 
Adjusted r^2..............: -0.020217 
Sample size of AE DB......: 623 
Sample size of model......: 204 
Missing data %............: 67.25522 

- processing MCP1_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ MedHx_CVD, data = currentDF)

Coefficients:
(Intercept)  MedHx_CVDNo  
      24.36        10.14  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-41.50 -18.36  -7.09   6.52 393.46 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)               -1.175e+02  1.248e+02  -0.942   0.3474  
currentDF[, TRAIT]         8.126e-01  3.051e+00   0.266   0.7903  
Age                        4.180e-01  4.306e-01   0.971   0.3329  
Gendermale                 7.399e+00  7.333e+00   1.009   0.3143  
ORdate_epoch               6.965e-03  8.221e-03   0.847   0.3980  
Hypertension.compositeyes  9.966e+00  9.557e+00   1.043   0.2984  
DiabetesStatusDiabetes    -1.158e+01  7.876e+00  -1.470   0.1432  
SmokerStatusEx-smoker     -9.844e+00  7.032e+00  -1.400   0.1632  
SmokerStatusNever smoked  -1.665e+01  9.084e+00  -1.833   0.0684 .
Med.Statin.LLDyes          3.631e+00  7.017e+00   0.517   0.6055  
Med.all.antiplateletyes   -7.078e+00  1.165e+01  -0.607   0.5444  
GFR_MDRD                  -1.415e-01  1.682e-01  -0.841   0.4012  
BMI                        2.905e-01  7.954e-01   0.365   0.7154  
MedHx_CVDNo                1.187e+01  6.453e+00   1.839   0.0675 .
stenose50-70%              2.040e+01  4.967e+01   0.411   0.6818  
stenose70-90%              2.665e+01  4.309e+01   0.618   0.5370  
stenose90-99%              2.758e+01  4.294e+01   0.642   0.5215  
stenose100% (Occlusion)    8.111e+00  5.425e+01   0.150   0.8813  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 41.78 on 184 degrees of freedom
Multiple R-squared:  0.06711,   Adjusted R-squared:  -0.01908 
F-statistic: 0.7786 on 17 and 184 DF,  p-value: 0.7162

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' MCP1_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: MCP1_rank 
Effect size...............: 0.812621 
Standard error............: 3.051377 
Odds ratio (effect size)..: 2.254 
Lower 95% CI..............: 0.006 
Upper 95% CI..............: 891.87 
T-value...................: 0.266313 
P-value...................: 0.7902964 
R^2.......................: 0.067111 
Adjusted r^2..............: -0.01908 
Sample size of AE DB......: 623 
Sample size of model......: 202 
Missing data %............: 67.57624 

- processing MIP1a_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ MedHx_CVD, data = currentDF)

Coefficients:
(Intercept)  MedHx_CVDNo  
      24.23        11.12  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-41.25 -19.78  -6.72   7.11 394.54 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)               -85.526838 126.232255  -0.678   0.4990  
currentDF[, TRAIT]          2.269791   3.236998   0.701   0.4841  
Age                         0.343128   0.449992   0.763   0.4468  
Gendermale                  8.165880   7.773708   1.050   0.2950  
ORdate_epoch                0.004457   0.008310   0.536   0.5924  
Hypertension.compositeyes  12.730777  10.186535   1.250   0.2131  
DiabetesStatusDiabetes    -11.992625   8.395786  -1.428   0.1550  
SmokerStatusEx-smoker      -9.667751   7.524746  -1.285   0.2006  
SmokerStatusNever smoked  -17.391007   9.667135  -1.799   0.0738 .
Med.Statin.LLDyes           3.616432   7.456169   0.485   0.6283  
Med.all.antiplateletyes    -3.413065  12.601680  -0.271   0.7868  
GFR_MDRD                   -0.138338   0.175293  -0.789   0.4311  
BMI                         0.308087   0.828785   0.372   0.7105  
MedHx_CVDNo                13.750137   6.971626   1.972   0.0502 .
stenose50-70%               3.492875  54.689881   0.064   0.9492  
stenose70-90%              25.096803  44.286292   0.567   0.5717  
stenose90-99%              23.838308  44.215146   0.539   0.5905  
stenose100% (Occlusion)     8.551463  55.763091   0.153   0.8783  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 42.7 on 172 degrees of freedom
Multiple R-squared:  0.07343,   Adjusted R-squared:  -0.01815 
F-statistic: 0.8018 on 17 and 172 DF,  p-value: 0.6895

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' MIP1a_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: MIP1a_rank 
Effect size...............: 2.269791 
Standard error............: 3.236998 
Odds ratio (effect size)..: 9.677 
Lower 95% CI..............: 0.017 
Upper 95% CI..............: 5509.926 
T-value...................: 0.701203 
P-value...................: 0.4841242 
R^2.......................: 0.073432 
Adjusted r^2..............: -0.018148 
Sample size of AE DB......: 623 
Sample size of model......: 190 
Missing data %............: 69.50241 

- processing RANTES_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    ORdate_epoch + Hypertension.composite + SmokerStatus + MedHx_CVD, 
    data = currentDF)

Coefficients:
              (Intercept)         currentDF[, TRAIT]                        Age               ORdate_epoch  Hypertension.compositeyes  
               -205.13985                    9.15454                    0.72013                    0.01372                   15.23186  
    SmokerStatusEx-smoker   SmokerStatusNever smoked                MedHx_CVDNo  
                 -7.86001                  -17.92475                   14.84256  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-42.44 -17.98  -7.91   8.01 368.77 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)               -2.118e+02  1.277e+02  -1.659   0.0989 .
currentDF[, TRAIT]         8.268e+00  3.335e+00   2.479   0.0141 *
Age                        5.564e-01  4.284e-01   1.299   0.1956  
Gendermale                 6.773e+00  7.323e+00   0.925   0.3562  
ORdate_epoch               1.395e-02  8.572e-03   1.628   0.1053  
Hypertension.compositeyes  1.341e+01  9.725e+00   1.378   0.1697  
DiabetesStatusDiabetes    -7.535e+00  7.924e+00  -0.951   0.3429  
SmokerStatusEx-smoker     -9.319e+00  7.072e+00  -1.318   0.1892  
SmokerStatusNever smoked  -1.856e+01  9.023e+00  -2.057   0.0411 *
Med.Statin.LLDyes          3.608e+00  6.955e+00   0.519   0.6045  
Med.all.antiplateletyes   -5.085e+00  1.144e+01  -0.445   0.6571  
GFR_MDRD                  -1.113e-01  1.667e-01  -0.667   0.5054  
BMI                        1.375e-01  7.872e-01   0.175   0.8615  
MedHx_CVDNo                1.506e+01  6.538e+00   2.303   0.0224 *
stenose50-70%              4.190e+00  5.238e+01   0.080   0.9363  
stenose70-90%              1.909e+01  4.273e+01   0.447   0.6556  
stenose90-99%              2.049e+01  4.251e+01   0.482   0.6304  
stenose100% (Occlusion)   -1.790e-01  5.389e+01  -0.003   0.9974  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 41.25 on 182 degrees of freedom
Multiple R-squared:  0.09999,   Adjusted R-squared:  0.01592 
F-statistic: 1.189 on 17 and 182 DF,  p-value: 0.2768

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' RANTES_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: RANTES_rank 
Effect size...............: 8.267776 
Standard error............: 3.335321 
Odds ratio (effect size)..: 3896.273 
Lower 95% CI..............: 5.644 
Upper 95% CI..............: 2689873 
T-value...................: 2.478855 
P-value...................: 0.01409078 
R^2.......................: 0.099991 
Adjusted r^2..............: 0.015924 
Sample size of AE DB......: 623 
Sample size of model......: 200 
Missing data %............: 67.89727 

- processing MIG_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Hypertension.composite + SmokerStatus + MedHx_CVD, data = currentDF)

Coefficients:
              (Intercept)         currentDF[, TRAIT]                        Age  Hypertension.compositeyes      SmokerStatusEx-smoker  
                  -24.499                      5.257                      0.646                     12.910                     -9.580  
 SmokerStatusNever smoked                MedHx_CVDNo  
                  -17.302                     12.401  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-43.07 -18.74  -7.04   7.30 393.90 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)               -64.778470 126.441970  -0.512   0.6090  
currentDF[, TRAIT]          4.673991   3.404447   1.373   0.1715  
Age                         0.466731   0.434350   1.075   0.2840  
Gendermale                  7.037912   7.367591   0.955   0.3407  
ORdate_epoch                0.002583   0.008488   0.304   0.7613  
Hypertension.compositeyes  11.369194   9.772964   1.163   0.2462  
DiabetesStatusDiabetes    -10.183391   7.991823  -1.274   0.2042  
SmokerStatusEx-smoker     -11.518984   7.149698  -1.611   0.1089  
SmokerStatusNever smoked  -18.393576   9.358234  -1.965   0.0509 .
Med.Statin.LLDyes           2.638366   7.107668   0.371   0.7109  
Med.all.antiplateletyes    -3.879083  11.231167  -0.345   0.7302  
GFR_MDRD                   -0.153723   0.168678  -0.911   0.3633  
BMI                         0.305130   0.787065   0.388   0.6987  
MedHx_CVDNo                12.447058   6.544033   1.902   0.0587 .
stenose50-70%               2.648918  53.405992   0.050   0.9605  
stenose70-90%              23.946012  43.193055   0.554   0.5800  
stenose90-99%              23.289951  43.097083   0.540   0.5896  
stenose100% (Occlusion)     9.451362  54.270501   0.174   0.8619  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 41.79 on 182 degrees of freedom
Multiple R-squared:  0.07496,   Adjusted R-squared:  -0.01145 
F-statistic: 0.8675 on 17 and 182 DF,  p-value: 0.613

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' MIG_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: MIG_rank 
Effect size...............: 4.673991 
Standard error............: 3.404447 
Odds ratio (effect size)..: 107.124 
Lower 95% CI..............: 0.136 
Upper 95% CI..............: 84686.07 
T-value...................: 1.372908 
P-value...................: 0.1714703 
R^2.......................: 0.074957 
Adjusted r^2..............: -0.011448 
Sample size of AE DB......: 623 
Sample size of model......: 200 
Missing data %............: 67.89727 

- processing IP10_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Hypertension.composite + SmokerStatus + MedHx_CVD, data = currentDF)

Coefficients:
              (Intercept)         currentDF[, TRAIT]                        Age  Hypertension.compositeyes      SmokerStatusEx-smoker  
                 -27.6393                     5.2772                     0.6609                    16.4819                   -10.7170  
 SmokerStatusNever smoked                MedHx_CVDNo  
                 -18.1202                    12.2824  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-47.72 -19.34  -7.02   6.42 392.70 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)               -1.248e+02  1.286e+02  -0.970   0.3334  
currentDF[, TRAIT]         4.887e+00  3.441e+00   1.420   0.1575  
Age                        4.895e-01  4.710e-01   1.039   0.3001  
Gendermale                 9.369e+00  7.725e+00   1.213   0.2270  
ORdate_epoch               6.635e-03  8.449e-03   0.785   0.4334  
Hypertension.compositeyes  1.398e+01  1.047e+01   1.336   0.1835  
DiabetesStatusDiabetes    -1.124e+01  8.755e+00  -1.284   0.2011  
SmokerStatusEx-smoker     -1.325e+01  7.796e+00  -1.699   0.0912 .
SmokerStatusNever smoked  -1.933e+01  1.005e+01  -1.923   0.0562 .
Med.Statin.LLDyes          3.657e+00  7.685e+00   0.476   0.6348  
Med.all.antiplateletyes   -3.083e+00  1.197e+01  -0.258   0.7971  
GFR_MDRD                  -1.399e-01  1.838e-01  -0.761   0.4476  
BMI                        3.432e-01  8.317e-01   0.413   0.6804  
MedHx_CVDNo                1.226e+01  7.081e+00   1.732   0.0852 .
stenose50-70%              2.500e+00  5.512e+01   0.045   0.9639  
stenose70-90%              2.508e+01  4.471e+01   0.561   0.5755  
stenose90-99%              2.539e+01  4.447e+01   0.571   0.5688  
stenose100% (Occlusion)    1.752e+01  5.617e+01   0.312   0.7555  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 43.1 on 166 degrees of freedom
Multiple R-squared:  0.08357,   Adjusted R-squared:  -0.01028 
F-statistic: 0.8905 on 17 and 166 DF,  p-value: 0.586

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' IP10_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: IP10_rank 
Effect size...............: 4.886577 
Standard error............: 3.441477 
Odds ratio (effect size)..: 132.499 
Lower 95% CI..............: 0.156 
Upper 95% CI..............: 112630.9 
T-value...................: 1.419907 
P-value...................: 0.15751 
R^2.......................: 0.083572 
Adjusted r^2..............: -0.010279 
Sample size of AE DB......: 623 
Sample size of model......: 184 
Missing data %............: 70.46549 

- processing Eotaxin1_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ MedHx_CVD, data = currentDF)

Coefficients:
(Intercept)  MedHx_CVDNo  
      24.31        10.03  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-40.87 -18.39  -7.49   5.71 394.27 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)               -1.048e+02  1.225e+02  -0.855   0.3937  
currentDF[, TRAIT]         1.168e+00  3.124e+00   0.374   0.7089  
Age                        3.957e-01  4.262e-01   0.928   0.3544  
Gendermale                 7.624e+00  7.262e+00   1.050   0.2951  
ORdate_epoch               6.024e-03  8.118e-03   0.742   0.4590  
Hypertension.compositeyes  9.114e+00  9.430e+00   0.967   0.3350  
DiabetesStatusDiabetes    -1.129e+01  7.821e+00  -1.443   0.1506  
SmokerStatusEx-smoker     -9.985e+00  7.016e+00  -1.423   0.1564  
SmokerStatusNever smoked  -1.651e+01  9.072e+00  -1.820   0.0704 .
Med.Statin.LLDyes          3.442e+00  6.951e+00   0.495   0.6211  
Med.all.antiplateletyes   -4.551e+00  1.095e+01  -0.416   0.6781  
GFR_MDRD                  -1.437e-01  1.667e-01  -0.862   0.3898  
BMI                        2.825e-01  7.798e-01   0.362   0.7176  
MedHx_CVDNo                1.188e+01  6.390e+00   1.859   0.0646 .
stenose50-70%              1.921e+01  4.955e+01   0.388   0.6987  
stenose70-90%              2.596e+01  4.298e+01   0.604   0.5466  
stenose90-99%              2.641e+01  4.294e+01   0.615   0.5392  
stenose100% (Occlusion)    9.080e+00  5.390e+01   0.168   0.8664  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 41.6 on 186 degrees of freedom
Multiple R-squared:  0.06561,   Adjusted R-squared:  -0.01979 
F-statistic: 0.7683 on 17 and 186 DF,  p-value: 0.7278

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' Eotaxin1_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: Eotaxin1_rank 
Effect size...............: 1.167919 
Standard error............: 3.12353 
Odds ratio (effect size)..: 3.215 
Lower 95% CI..............: 0.007 
Upper 95% CI..............: 1465.626 
T-value...................: 0.37391 
P-value...................: 0.7088973 
R^2.......................: 0.065612 
Adjusted r^2..............: -0.019789 
Sample size of AE DB......: 623 
Sample size of model......: 204 
Missing data %............: 67.25522 

- processing TARC_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    MedHx_CVD, data = currentDF)

Coefficients:
       (Intercept)  currentDF[, TRAIT]                 Age         MedHx_CVDNo  
           -22.834               4.952               0.687              13.560  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-51.99 -18.84  -7.23   7.33 383.80 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)               -246.43653  150.53202  -1.637   0.1035  
currentDF[, TRAIT]           6.53108    3.59260   1.818   0.0709 .
Age                          0.77876    0.47939   1.624   0.1062  
Gendermale                  12.93610    8.08822   1.599   0.1117  
ORdate_epoch                 0.01447    0.01039   1.393   0.1655  
Hypertension.compositeyes   10.37972   10.19722   1.018   0.3102  
DiabetesStatusDiabetes     -10.83813    8.54016  -1.269   0.2062  
SmokerStatusEx-smoker      -10.06849    7.74560  -1.300   0.1955  
SmokerStatusNever smoked   -20.09032    9.76266  -2.058   0.0412 *
Med.Statin.LLDyes            3.16041    7.94842   0.398   0.6914  
Med.all.antiplateletyes     -3.14640   12.46589  -0.252   0.8011  
GFR_MDRD                    -0.11128    0.18625  -0.597   0.5510  
BMI                          0.21495    0.85844   0.250   0.8026  
MedHx_CVDNo                 14.53232    7.09559   2.048   0.0422 *
stenose50-70%               28.87864   54.61610   0.529   0.5977  
stenose70-90%               31.04845   44.62102   0.696   0.4875  
stenose90-99%               26.93155   44.47606   0.606   0.5457  
stenose100% (Occlusion)     19.24844   56.62469   0.340   0.7343  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 43.14 on 162 degrees of freedom
Multiple R-squared:  0.1014,    Adjusted R-squared:  0.007075 
F-statistic: 1.075 on 17 and 162 DF,  p-value: 0.3824

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' TARC_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: TARC_rank 
Effect size...............: 6.531079 
Standard error............: 3.592599 
Odds ratio (effect size)..: 686.138 
Lower 95% CI..............: 0.6 
Upper 95% CI..............: 784320.6 
T-value...................: 1.817926 
P-value...................: 0.07092285 
R^2.......................: 0.101375 
Adjusted r^2..............: 0.007075 
Sample size of AE DB......: 623 
Sample size of model......: 180 
Missing data %............: 71.10754 

- processing PARC_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ MedHx_CVD, data = currentDF)

Coefficients:
(Intercept)  MedHx_CVDNo  
      24.31        10.03  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-40.77 -18.15  -7.41   7.22 393.04 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)               -1.737e+02  1.298e+02  -1.338   0.1824  
currentDF[, TRAIT]         4.192e+00  3.292e+00   1.273   0.2045  
Age                        4.242e-01  4.222e-01   1.005   0.3163  
Gendermale                 8.315e+00  7.182e+00   1.158   0.2484  
ORdate_epoch               1.074e-02  8.579e-03   1.252   0.2121  
Hypertension.compositeyes  1.101e+01  9.507e+00   1.158   0.2483  
DiabetesStatusDiabetes    -1.092e+01  7.781e+00  -1.404   0.1620  
SmokerStatusEx-smoker     -1.004e+01  6.955e+00  -1.444   0.1504  
SmokerStatusNever smoked  -1.768e+01  9.021e+00  -1.960   0.0515 .
Med.Statin.LLDyes          3.120e+00  6.925e+00   0.451   0.6528  
Med.all.antiplateletyes   -3.401e+00  1.090e+01  -0.312   0.7555  
GFR_MDRD                  -1.185e-01  1.674e-01  -0.708   0.4799  
BMI                        3.792e-01  7.808e-01   0.486   0.6277  
MedHx_CVDNo                1.140e+01  6.360e+00   1.792   0.0747 .
stenose50-70%              2.035e+01  4.924e+01   0.413   0.6799  
stenose70-90%              2.601e+01  4.272e+01   0.609   0.5433  
stenose90-99%              2.742e+01  4.256e+01   0.644   0.5203  
stenose100% (Occlusion)    1.530e+01  5.379e+01   0.284   0.7764  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 41.43 on 186 degrees of freedom
Multiple R-squared:  0.07299,   Adjusted R-squared:  -0.01174 
F-statistic: 0.8615 on 17 and 186 DF,  p-value: 0.6201

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' PARC_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: PARC_rank 
Effect size...............: 4.191655 
Standard error............: 3.291742 
Odds ratio (effect size)..: 66.132 
Lower 95% CI..............: 0.104 
Upper 95% CI..............: 41917.97 
T-value...................: 1.273385 
P-value...................: 0.2044705 
R^2.......................: 0.072991 
Adjusted r^2..............: -0.011736 
Sample size of AE DB......: 623 
Sample size of model......: 204 
Missing data %............: 67.25522 

- processing MDC_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ MedHx_CVD, data = currentDF)

Coefficients:
(Intercept)  MedHx_CVDNo  
      24.69        10.66  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-41.50 -19.63  -7.43   5.70 392.76 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)               -1.182e+02  1.306e+02  -0.905   0.3669  
currentDF[, TRAIT]         2.015e+00  3.426e+00   0.588   0.5573  
Age                        3.804e-01  4.500e-01   0.845   0.3991  
Gendermale                 8.941e+00  7.746e+00   1.154   0.2500  
ORdate_epoch               6.451e-03  8.710e-03   0.741   0.4599  
Hypertension.compositeyes  1.327e+01  1.021e+01   1.299   0.1957  
DiabetesStatusDiabetes    -1.044e+01  8.495e+00  -1.229   0.2207  
SmokerStatusEx-smoker     -9.978e+00  7.510e+00  -1.329   0.1857  
SmokerStatusNever smoked  -1.774e+01  9.666e+00  -1.835   0.0682 .
Med.Statin.LLDyes          3.631e+00  7.553e+00   0.481   0.6313  
Med.all.antiplateletyes   -2.351e+00  1.267e+01  -0.186   0.8530  
GFR_MDRD                  -1.159e-01  1.752e-01  -0.662   0.5091  
BMI                        3.088e-01  8.351e-01   0.370   0.7120  
MedHx_CVDNo                1.345e+01  6.992e+00   1.924   0.0560 .
stenose50-70%              3.757e+00  5.489e+01   0.068   0.9455  
stenose70-90%              2.636e+01  4.435e+01   0.594   0.5530  
stenose90-99%              2.585e+01  4.420e+01   0.585   0.5594  
stenose100% (Occlusion)    1.077e+01  5.589e+01   0.193   0.8474  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 42.83 on 172 degrees of freedom
Multiple R-squared:  0.07118,   Adjusted R-squared:  -0.02062 
F-statistic: 0.7754 on 17 and 172 DF,  p-value: 0.7195

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' MDC_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: MDC_rank 
Effect size...............: 2.014567 
Standard error............: 3.425852 
Odds ratio (effect size)..: 7.497 
Lower 95% CI..............: 0.009 
Upper 95% CI..............: 6181.014 
T-value...................: 0.588049 
P-value...................: 0.557271 
R^2.......................: 0.071183 
Adjusted r^2..............: -0.020619 
Sample size of AE DB......: 623 
Sample size of model......: 190 
Missing data %............: 69.50241 

- processing OPG_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Hypertension.composite + SmokerStatus + MedHx_CVD, data = currentDF)

Coefficients:
              (Intercept)         currentDF[, TRAIT]                        Age  Hypertension.compositeyes      SmokerStatusEx-smoker  
                 -22.3186                     4.7969                     0.6208                    12.3750                    -9.4542  
 SmokerStatusNever smoked                MedHx_CVDNo  
                 -16.3703                    12.1656  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-46.26 -18.37  -7.62   6.21 386.12 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)               -1.222e+02  1.204e+02  -1.015   0.3115  
currentDF[, TRAIT]         4.629e+00  3.003e+00   1.542   0.1249  
Age                        4.883e-01  4.260e-01   1.146   0.2531  
Gendermale                 7.339e+00  7.173e+00   1.023   0.3076  
ORdate_epoch               6.686e-03  7.923e-03   0.844   0.3998  
Hypertension.compositeyes  1.038e+01  9.408e+00   1.103   0.2713  
DiabetesStatusDiabetes    -1.124e+01  7.754e+00  -1.450   0.1488  
SmokerStatusEx-smoker     -1.122e+01  7.005e+00  -1.601   0.1110  
SmokerStatusNever smoked  -1.767e+01  8.971e+00  -1.970   0.0503 .
Med.Statin.LLDyes          3.019e+00  6.911e+00   0.437   0.6628  
Med.all.antiplateletyes   -5.778e+00  1.090e+01  -0.530   0.5968  
GFR_MDRD                  -1.446e-01  1.656e-01  -0.873   0.3840  
BMI                        3.763e-01  7.777e-01   0.484   0.6290  
MedHx_CVDNo                1.160e+01  6.342e+00   1.829   0.0690 .
stenose50-70%              1.850e+01  4.916e+01   0.376   0.7071  
stenose70-90%              2.790e+01  4.263e+01   0.654   0.5136  
stenose90-99%              2.795e+01  4.248e+01   0.658   0.5114  
stenose100% (Occlusion)    1.650e+01  5.368e+01   0.307   0.7589  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 41.35 on 186 degrees of freedom
Multiple R-squared:  0.07671,   Adjusted R-squared:  -0.007682 
F-statistic: 0.909 on 17 and 186 DF,  p-value: 0.5643

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' OPG_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: OPG_rank 
Effect size...............: 4.628562 
Standard error............: 3.00256 
Odds ratio (effect size)..: 102.367 
Lower 95% CI..............: 0.285 
Upper 95% CI..............: 36812.04 
T-value...................: 1.541538 
P-value...................: 0.1248854 
R^2.......................: 0.076705 
Adjusted r^2..............: -0.007682 
Sample size of AE DB......: 623 
Sample size of model......: 204 
Missing data %............: 67.25522 

- processing sICAM1_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ MedHx_CVD, data = currentDF)

Coefficients:
(Intercept)  MedHx_CVDNo  
      24.31        10.03  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-40.83 -18.46  -7.20   5.33 392.59 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)               -99.007162 123.792020  -0.800   0.4249  
currentDF[, TRAIT]         -1.554682   3.153846  -0.493   0.6226  
Age                         0.329154   0.431170   0.763   0.4462  
Gendermale                  8.060260   7.205466   1.119   0.2647  
ORdate_epoch                0.005674   0.008186   0.693   0.4891  
Hypertension.compositeyes   8.643379   9.478823   0.912   0.3630  
DiabetesStatusDiabetes    -11.791330   7.816061  -1.509   0.1331  
SmokerStatusEx-smoker      -9.582201   6.980929  -1.373   0.1715  
SmokerStatusNever smoked  -15.281140   9.061048  -1.686   0.0934 .
Med.Statin.LLDyes           3.628623   6.943220   0.523   0.6019  
Med.all.antiplateletyes    -4.152514  10.926391  -0.380   0.7043  
GFR_MDRD                   -0.154310   0.167481  -0.921   0.3581  
BMI                         0.287153   0.779702   0.368   0.7131  
MedHx_CVDNo                11.424561   6.409624   1.782   0.0763 .
stenose50-70%              21.552243  49.476901   0.436   0.6636  
stenose70-90%              29.044356  43.056954   0.675   0.5008  
stenose90-99%              29.881913  42.893386   0.697   0.4869  
stenose100% (Occlusion)    11.543342  53.911690   0.214   0.8307  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 41.59 on 186 degrees of freedom
Multiple R-squared:  0.06613,   Adjusted R-squared:  -0.01922 
F-statistic: 0.7748 on 17 and 186 DF,  p-value: 0.7205

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' sICAM1_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: sICAM1_rank 
Effect size...............: -1.554682 
Standard error............: 3.153846 
Odds ratio (effect size)..: 0.211 
Lower 95% CI..............: 0 
Upper 95% CI..............: 102.192 
T-value...................: -0.492948 
P-value...................: 0.6226308 
R^2.......................: 0.066129 
Adjusted r^2..............: -0.019224 
Sample size of AE DB......: 623 
Sample size of model......: 204 
Missing data %............: 67.25522 

- processing VEGFA_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ DiabetesStatus + GFR_MDRD, 
    data = currentDF)

Coefficients:
           (Intercept)  DiabetesStatusDiabetes                GFR_MDRD  
               44.1105                 -7.9409                 -0.2219  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-33.641 -16.006  -5.282   7.515 203.674 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)
(Intercept)                53.268475  94.897400   0.561    0.575
currentDF[, TRAIT]          0.395968   2.540890   0.156    0.876
Age                         0.152157   0.332547   0.458    0.648
Gendermale                  4.713248   5.638215   0.836    0.404
ORdate_epoch               -0.002097   0.007054  -0.297    0.767
Hypertension.compositeyes   6.418088   7.533300   0.852    0.396
DiabetesStatusDiabetes     -7.102697   6.049006  -1.174    0.242
SmokerStatusEx-smoker      -1.877933   5.377992  -0.349    0.727
SmokerStatusNever smoked   -4.903360   7.365528  -0.666    0.507
Med.Statin.LLDyes          -0.561638   5.406214  -0.104    0.917
Med.all.antiplateletyes    -4.063880   8.074917  -0.503    0.615
GFR_MDRD                   -0.190908   0.119530  -1.597    0.112
BMI                        -0.369760   0.618446  -0.598    0.551
MedHx_CVDNo                 7.346535   5.021120   1.463    0.145
stenose70-90%              10.355581  23.162381   0.447    0.655
stenose90-99%               7.628656  22.946463   0.332    0.740
stenose100% (Occlusion)   -13.255740  32.666891  -0.406    0.685

Residual standard error: 30.2 on 160 degrees of freedom
Multiple R-squared:  0.06544,   Adjusted R-squared:  -0.02802 
F-statistic: 0.7002 on 16 and 160 DF,  p-value: 0.7909

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' VEGFA_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: VEGFA_rank 
Effect size...............: 0.395968 
Standard error............: 2.54089 
Odds ratio (effect size)..: 1.486 
Lower 95% CI..............: 0.01 
Upper 95% CI..............: 216.18 
T-value...................: 0.155838 
P-value...................: 0.8763568 
R^2.......................: 0.065436 
Adjusted r^2..............: -0.028021 
Sample size of AE DB......: 623 
Sample size of model......: 177 
Missing data %............: 71.58908 

- processing TGFB_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ MedHx_CVD, data = currentDF)

Coefficients:
(Intercept)  MedHx_CVDNo  
     24.654        9.944  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-42.14 -18.17  -7.28   6.40 392.39 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)               -1.023e+02  1.203e+02  -0.850   0.3963  
currentDF[, TRAIT]         1.746e+00  3.054e+00   0.572   0.5683  
Age                        3.636e-01  4.274e-01   0.851   0.3960  
Gendermale                 7.756e+00  7.161e+00   1.083   0.2802  
ORdate_epoch               6.208e-03  7.978e-03   0.778   0.4375  
Hypertension.compositeyes  9.095e+00  9.321e+00   0.976   0.3304  
DiabetesStatusDiabetes    -1.127e+01  7.597e+00  -1.483   0.1397  
SmokerStatusEx-smoker     -8.887e+00  6.979e+00  -1.273   0.2045  
SmokerStatusNever smoked  -1.596e+01  9.262e+00  -1.723   0.0865 .
Med.Statin.LLDyes          3.973e+00  6.963e+00   0.571   0.5689  
Med.all.antiplateletyes   -4.516e+00  1.125e+01  -0.401   0.6886  
GFR_MDRD                  -1.505e-01  1.669e-01  -0.902   0.3683  
BMI                        2.097e-01  7.890e-01   0.266   0.7907  
MedHx_CVDNo                1.211e+01  6.393e+00   1.894   0.0598 .
stenose50-70%              1.668e+01  4.979e+01   0.335   0.7380  
stenose70-90%              2.503e+01  4.300e+01   0.582   0.5613  
stenose90-99%              2.557e+01  4.286e+01   0.597   0.5515  
stenose100% (Occlusion)    4.544e+00  5.437e+01   0.084   0.9335  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 41.61 on 186 degrees of freedom
Multiple R-squared:  0.06575,   Adjusted R-squared:  -0.01964 
F-statistic:  0.77 on 17 and 186 DF,  p-value: 0.7259

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' TGFB_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: TGFB_rank 
Effect size...............: 1.745713 
Standard error............: 3.054339 
Odds ratio (effect size)..: 5.73 
Lower 95% CI..............: 0.014 
Upper 95% CI..............: 2280.654 
T-value...................: 0.571552 
P-value...................: 0.5683157 
R^2.......................: 0.065745 
Adjusted r^2..............: -0.019644 
Sample size of AE DB......: 623 
Sample size of model......: 204 
Missing data %............: 67.25522 

- processing MMP2_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ DiabetesStatus + GFR_MDRD, 
    data = currentDF)

Coefficients:
           (Intercept)  DiabetesStatusDiabetes                GFR_MDRD  
               42.2734                 -7.3574                 -0.2098  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
   Min     1Q Median     3Q    Max 
-32.15 -15.43  -5.30   6.99 208.83 

Coefficients:
                           Estimate Std. Error t value Pr(>|t|)  
(Intercept)               74.018797  86.507857   0.856   0.3933  
currentDF[, TRAIT]        -2.090658   2.200871  -0.950   0.3434  
Age                       -0.067845   0.294986  -0.230   0.8183  
Gendermale                 1.951811   4.996768   0.391   0.6965  
ORdate_epoch              -0.003096   0.005689  -0.544   0.5869  
Hypertension.compositeyes  6.159844   6.762394   0.911   0.3635  
DiabetesStatusDiabetes    -7.744756   5.411505  -1.431   0.1541  
SmokerStatusEx-smoker     -0.817478   4.894311  -0.167   0.8675  
SmokerStatusNever smoked  -6.332275   6.395858  -0.990   0.3234  
Med.Statin.LLDyes         -1.140844   4.816423  -0.237   0.8130  
Med.all.antiplateletyes   -5.443826   7.629261  -0.714   0.4764  
GFR_MDRD                  -0.210949   0.112666  -1.872   0.0627 .
BMI                       -0.181914   0.561272  -0.324   0.7462  
MedHx_CVDNo                5.953441   4.473470   1.331   0.1849  
stenose50-70%             12.493186  34.585953   0.361   0.7183  
stenose70-90%             16.397904  30.017654   0.546   0.5855  
stenose90-99%             14.369162  29.895341   0.481   0.6313  
stenose100% (Occlusion)   -8.503293  37.713491  -0.225   0.8219  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 29.07 on 186 degrees of freedom
Multiple R-squared:  0.06243,   Adjusted R-squared:  -0.02326 
F-statistic: 0.7286 on 17 and 186 DF,  p-value: 0.771

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' MMP2_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: MMP2_rank 
Effect size...............: -2.090658 
Standard error............: 2.200871 
Odds ratio (effect size)..: 0.124 
Lower 95% CI..............: 0.002 
Upper 95% CI..............: 9.235 
T-value...................: -0.949923 
P-value...................: 0.343384 
R^2.......................: 0.062433 
Adjusted r^2..............: -0.023258 
Sample size of AE DB......: 623 
Sample size of model......: 204 
Missing data %............: 67.25522 

- processing MMP8_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ DiabetesStatus + GFR_MDRD, 
    data = currentDF)

Coefficients:
           (Intercept)  DiabetesStatusDiabetes                GFR_MDRD  
               42.2734                 -7.3574                 -0.2098  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-33.852 -15.970  -6.054   5.975 208.385 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)
(Intercept)                63.844569  85.362558   0.748    0.455
currentDF[, TRAIT]          1.511752   2.137264   0.707    0.480
Age                        -0.024978   0.294538  -0.085    0.933
Gendermale                  1.971742   5.031919   0.392    0.696
ORdate_epoch               -0.002342   0.005615  -0.417    0.677
Hypertension.compositeyes   7.187075   6.679536   1.076    0.283
DiabetesStatusDiabetes     -7.378232   5.458786  -1.352    0.178
SmokerStatusEx-smoker      -0.952355   4.895004  -0.195    0.846
SmokerStatusNever smoked   -7.114988   6.337931  -1.123    0.263
Med.Statin.LLDyes          -1.136474   4.821831  -0.236    0.814
Med.all.antiplateletyes    -5.592372   7.634365  -0.733    0.465
GFR_MDRD                   -0.185300   0.113467  -1.633    0.104
BMI                        -0.173248   0.562203  -0.308    0.758
MedHx_CVDNo                 6.357757   4.496734   1.414    0.159
stenose50-70%               7.596491  34.874121   0.218    0.828
stenose70-90%              10.942004  30.755176   0.356    0.722
stenose90-99%               9.530358  30.506194   0.312    0.755
stenose100% (Occlusion)   -13.415128  38.433311  -0.349    0.727

Residual standard error: 29.1 on 186 degrees of freedom
Multiple R-squared:  0.06041,   Adjusted R-squared:  -0.02546 
F-statistic: 0.7035 on 17 and 186 DF,  p-value: 0.797

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' MMP8_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: MMP8_rank 
Effect size...............: 1.511752 
Standard error............: 2.137264 
Odds ratio (effect size)..: 4.535 
Lower 95% CI..............: 0.069 
Upper 95% CI..............: 299.104 
T-value...................: 0.707331 
P-value...................: 0.4802463 
R^2.......................: 0.060412 
Adjusted r^2..............: -0.025464 
Sample size of AE DB......: 623 
Sample size of model......: 204 
Missing data %............: 67.25522 

- processing MMP9_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ DiabetesStatus + GFR_MDRD, 
    data = currentDF)

Coefficients:
           (Intercept)  DiabetesStatusDiabetes                GFR_MDRD  
               42.2734                 -7.3574                 -0.2098  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-33.821 -15.997  -5.084   6.144 207.615 

Coefficients:
                           Estimate Std. Error t value Pr(>|t|)
(Intercept)               47.913532  85.334448   0.561    0.575
currentDF[, TRAIT]         2.347440   2.094236   1.121    0.264
Age                       -0.002189   0.295112  -0.007    0.994
Gendermale                 2.259763   4.956587   0.456    0.649
ORdate_epoch              -0.001518   0.005628  -0.270    0.788
Hypertension.compositeyes  8.495942   6.764760   1.256    0.211
DiabetesStatusDiabetes    -7.127082   5.444518  -1.309    0.192
SmokerStatusEx-smoker     -1.279841   4.878789  -0.262    0.793
SmokerStatusNever smoked  -7.564734   6.332166  -1.195    0.234
Med.Statin.LLDyes         -1.385048   4.815149  -0.288    0.774
Med.all.antiplateletyes   -6.358506   7.621269  -0.834    0.405
GFR_MDRD                  -0.175186   0.113635  -1.542    0.125
BMI                       -0.167655   0.559435  -0.300    0.765
MedHx_CVDNo                6.415670   4.479146   1.432    0.154
stenose50-70%             10.036623  34.514516   0.291    0.772
stenose70-90%             13.989492  30.012706   0.466    0.642
stenose90-99%             12.317485  29.886655   0.412    0.681
stenose100% (Occlusion)   -8.864009  37.680419  -0.235    0.814

Residual standard error: 29.04 on 186 degrees of freedom
Multiple R-squared:  0.06421,   Adjusted R-squared:  -0.02132 
F-statistic: 0.7507 on 17 and 186 DF,  p-value: 0.7472

Analyzing in dataset ' AEDB.CEA ' the association of ' HDAC9 ' with ' MMP9_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: HDAC9 
Trait/outcome.............: MMP9_rank 
Effect size...............: 2.34744 
Standard error............: 2.094236 
Odds ratio (effect size)..: 10.459 
Lower 95% CI..............: 0.173 
Upper 95% CI..............: 634.06 
T-value...................: 1.120905 
P-value...................: 0.2637735 
R^2.......................: 0.064206 
Adjusted r^2..............: -0.021324 
Sample size of AE DB......: 623 
Sample size of model......: 204 
Missing data %............: 67.25522 
cat("Edit the column names...\n")
Edit the column names...
colnames(GLM.results) = c("Dataset", "Predictor", "Trait",
                          "Beta", "s.e.m.",
                          "OR", "low95CI", "up95CI",
                          "T-value", "P-value", "r^2", "r^2_adj", "N", "Model_N", "Perc_Miss")

cat("Correct the variable types...\n")
Correct the variable types...
GLM.results$Beta <- as.numeric(GLM.results$Beta)
GLM.results$s.e.m. <- as.numeric(GLM.results$s.e.m.)
GLM.results$OR <- as.numeric(GLM.results$OR)
GLM.results$low95CI <- as.numeric(GLM.results$low95CI)
GLM.results$up95CI <- as.numeric(GLM.results$up95CI)
GLM.results$`T-value` <- as.numeric(GLM.results$`T-value`)
GLM.results$`P-value` <- as.numeric(GLM.results$`P-value`)
GLM.results$`r^2` <- as.numeric(GLM.results$`r^2`)
GLM.results$`r^2_adj` <- as.numeric(GLM.results$`r^2_adj`)
GLM.results$`N` <- as.numeric(GLM.results$`N`)
GLM.results$`Model_N` <- as.numeric(GLM.results$`Model_N`)
GLM.results$`Perc_Miss` <- as.numeric(GLM.results$`Perc_Miss`)
DT::datatable(GLM.results)

# Save the data
cat("Writing results to Excel-file...\n")
### Univariate
library(openxlsx)
write.xlsx(GLM.results,
           file = paste0(OUT_loc, "/",Today,".AERNASE.clin.hdac9.Con.Multi.",TRAIT_OF_INTEREST,"_Plaque.Cytokines_Plaques.RANK.MODEL2.xlsx"),
           rowNames = FALSE, colNames = TRUE, sheetName = "Con.Multi.PlaquePheno")
# Removing intermediates
cat("Removing intermediate files...\n")
rm(TRAIT, trait, currentDF, GLM.results, GLM.results.TEMP, fit, model_step)

HDAC9 levels vs. vulnerability index

Here we plot the levels of inverse-rank normal transformed target(s) plaque levels from experiment 1 and 2 to the Plaque vulnerability index.

library(sjlabelled)

AERNASE.clin.hdac9$yeartemp <- as.numeric(year(AERNASE.clin.hdac9$dateok))

attach(AERNASE.clin.hdac9)

AERNASE.clin.hdac9[,"ORyearGroup"] <- NA
AERNASE.clin.hdac9$ORyearGroup[yeartemp <= 2007] <- "< 2007"
AERNASE.clin.hdac9$ORyearGroup[yeartemp > 2007] <- "> 2007"
detach(AERNASE.clin.hdac9)

table(AERNASE.clin.hdac9$ORyearGroup, AERNASE.clin.hdac9$ORdate_year)
        
         No data available/missing 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019
  < 2007                         0   32   62   66   82   85   67    0    0    0    0    0    0    0    0    0    0    0    0
  > 2007                         0    0    0    0    0    0    0   63   67   34   31   22    5    3    3    1    0    0    0

Visualisations

# Global test
compare_means(HDAC9 ~ Plaque_Vulnerability_Index,  data = AERNASE.clin.hdac9, method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AERNASE.clin.hdac9, 
                  x = "Plaque_Vulnerability_Index",
                  y = "HDAC9", 
                  xlab = "Plaque vulnerability index",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Plaque_Vulnerability_Index",
                  palette = "npg",
                  add = "jitter", 
                  add.params = list(size = 2, jitter = 0.2)) +
  stat_compare_means(label = "p.format",  method = "kruskal.test") +
  font("xlab", size = 17) +
  font("ylab", size = 17) +
  font("xy.text", size = 16) +
  font("legend.title", face = "bold") 
  
ggpar(p1, legend = "bottom", legend.title = "Plaque vulnerability index")


ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.PlaqueVulnerabilityIndex.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ Plaque_Vulnerability_Index,  data = AERNASE.clin.hdac9, method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AERNASE.clin.hdac9, 
                  x = "Plaque_Vulnerability_Index",
                  y = "HDAC9_max100", 
                  xlab = "Plaque vulnerability index",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Plaque_Vulnerability_Index",
                  palette = "npg",
                  add = "jitter", 
                  add.params = list(size = 2, jitter = 0.2)) +
  stat_compare_means(label = "p.format",  method = "kruskal.test") +
  font("xlab", size = 17) +
  font("ylab", size = 17) +
  font("xy.text", size = 16) +
  font("legend.title", face = "bold") 
  
ggpar(p1, legend = "bottom", legend.title = "Plaque vulnerability index")


ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".max100.plaque.PlaqueVulnerabilityIndex.pdf"), plot = last_plot())
Saving 12 x 8 in image
# Global test
compare_means(HDAC9 ~ Plaque_Vulnerability_Index,  data = AERNASE.clin.hdac9, method = "kruskal.test")

p1 <- ggpubr::ggbarplot(AERNASE.clin.hdac9, 
                  x = "Plaque_Vulnerability_Index",
                  y = "HDAC9", 
                  xlab = "Plaque vulnerability index",
                  ylab = "HDAC9 (normalized expression)\n",
                  col = "Plaque_Vulnerability_Index",
                  fill = "Plaque_Vulnerability_Index",
                  palette = "npg",
                  add = "median_iqr", error.plot = "upper_errorbar") +
  stat_compare_means(label = "p.format",  method = "kruskal.test",
                     label.x = 1, label.y = 50) +
  font("xlab", size = 17) +
  font("ylab", size = 17) +
  font("xy.text", size = 16) +
  font("legend.title", face = "bold") 
  
ggpar(p1, legend = "bottom", legend.title = "Plaque vulnerability index", ylim = c(0, 55))


ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.PlaqueVulnerabilityIndex.BarPlot.median_iqr.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ Plaque_Vulnerability_Index,  data = AERNASE.clin.hdac9, method = "kruskal.test")

p1 <- ggpubr::ggbarplot(AERNASE.clin.hdac9, 
                  x = "Plaque_Vulnerability_Index",
                  y = "HDAC9_max100", 
                  xlab = "Plaque vulnerability index",
                  ylab = "HDAC9 (normalized expression)\n",
                  col = "Plaque_Vulnerability_Index",
                  fill = "Plaque_Vulnerability_Index",
                  palette = "npg",
                  add = "median_iqr", error.plot = "upper_errorbar") +
  stat_compare_means(label = "p.format",  method = "kruskal.test",
                     label.x = 1, label.y = 50) +
  font("xlab", size = 17) +
  font("ylab", size = 17) +
  font("xy.text", size = 16) +
  font("legend.title", face = "bold") 
  
ggpar(p1, legend = "bottom", legend.title = "Plaque vulnerability index", ylim = c(0, 55))


ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".max100.plaque.PlaqueVulnerabilityIndex.BarPlot.median_iqr.pdf"), plot = last_plot())
Saving 12 x 8 in image
p1 <- ggpubr::ggbarplot(AERNASE.clin.hdac9, 
                  x = "Plaque_Vulnerability_Index",
                  y = "HDAC9", 
                  xlab = "Plaque vulnerability index",
                  ylab = "HDAC9 (normalized expression)\n",
                  col = "Plaque_Vulnerability_Index",
                  fill = "Plaque_Vulnerability_Index",
                  palette = "npg",
                  add = "mean_se", error.plot = "upper_errorbar") +
  stat_compare_means(label = "p.format",  method = "kruskal.test",
                     label.x = 1, label.y = 50) +
  font("xlab", size = 17) +
  font("ylab", size = 17) +
  font("xy.text", size = 16) +
  font("legend.title", face = "bold") 
  
ggpar(p1, legend = "bottom", legend.title = "Plaque vulnerability index", ylim = c(0, 55))


ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.PlaqueVulnerabilityIndex.BarPlot.means_se.pdf"), plot = last_plot())
Saving 12 x 8 in image
p1 <- ggpubr::ggbarplot(AERNASE.clin.hdac9, 
                  x = "Plaque_Vulnerability_Index",
                  y = "HDAC9_max100", 
                  xlab = "Plaque vulnerability index",
                  ylab = "HDAC9 (normalized expression)\n",
                  col = "Plaque_Vulnerability_Index",
                  fill = "Plaque_Vulnerability_Index",
                  palette = "npg",
                  add = "mean_se", error.plot = "upper_errorbar") +
  stat_compare_means(label = "p.format",  method = "kruskal.test",
                     label.x = 1, label.y = 50) +
  font("xlab", size = 17) +
  font("ylab", size = 17) +
  font("xy.text", size = 16) +
  font("legend.title", face = "bold") 
  
ggpar(p1, legend = "bottom", legend.title = "Plaque vulnerability index", ylim = c(0, 55))


ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".max100.plaque.PlaqueVulnerabilityIndex.BarPlot.means_se.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ Plaque_Vulnerability_Index,  data = subset(AERNASE.clin.hdac9, HDAC9 <100), method = "kruskal.test")

p1 <- ggpubr::ggboxplot(subset(AERNASE.clin.hdac9, HDAC9 <100) , 
                  x = "Plaque_Vulnerability_Index",
                  y = "HDAC9", 
                  xlab = "Plaque vulnerability index",
                  ylab = "HDAC9 (normalized expression)\noutliers above 100 are removed",
                  col = "Plaque_Vulnerability_Index",
                  fill = "Plaque_Vulnerability_Index",
                  palette = "npg",
                  add = "boxplot", error.plot = "crossbar") +
  stat_compare_means(label = "p.format",  method = "kruskal.test",
                     label.x = 1, label.y = 50) +
  font("xlab", size = 17) +
  font("ylab", size = 17) +
  font("xy.text", size = 16) +
  font("legend.title", face = "bold") 
  
ggpar(p1, legend = "bottom", legend.title = "Plaque vulnerability index")


ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.PlaqueVulnerabilityIndex.Boxplot.outlier_above_100_removed.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ Plaque_Vulnerability_Index,  data = AERNASE.clin.hdac9, method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AERNASE.clin.hdac9, 
                  x = "Plaque_Vulnerability_Index",
                  y = "HDAC9", 
                  facet.by = "Plaque_Vulnerability_Index",
                  xlab = "Plaque vulnerability index",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Plaque_Vulnerability_Index",
                  palette = "npg",
                  add = "jitter", 
                  add.params = list(size = 2, jitter = 0.2)) +
  stat_compare_means(label = "p.format",  method = "kruskal.test") +
  font("xlab", size = 17) +
  font("ylab", size = 17) +
  font("xy.text", size = 16) +
  font("legend.title", face = "bold") 
  
ggpar(p1, legend = "bottom", legend.title = "Plaque vulnerability index")


ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.FacetByPlaqueVulnerabilityIndex.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ Plaque_Vulnerability_Index,  data = AERNASE.clin.hdac9, method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AERNASE.clin.hdac9, 
                  x = "Plaque_Vulnerability_Index",
                  y = "HDAC9_max100", 
                  facet.by = "Plaque_Vulnerability_Index",
                  xlab = "Plaque vulnerability index",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Plaque_Vulnerability_Index",
                  palette = "npg",
                  add = "jitter", 
                  add.params = list(size = 2, jitter = 0.2)) +
  stat_compare_means(label = "p.format",  method = "kruskal.test") +
  font("xlab", size = 17) +
  font("ylab", size = 17) +
  font("xy.text", size = 16) +
  font("legend.title", face = "bold") 
  
ggpar(p1, legend = "bottom", legend.title = "Plaque vulnerability index")


ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".max100.plaque.FacetByPlaqueVulnerabilityIndex.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ Plaque_Vulnerability_Index, group.by = "Gender", data = AERNASE.clin.hdac9, method = "kruskal.test")
p2 <- ggpubr::ggboxplot(AERNASE.clin.hdac9, 
                  x = "Plaque_Vulnerability_Index",
                  y = "HDAC9", 
                  xlab = "Plaque vulnerability index by gender",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format",  method = "kruskal.test")
ggpar(p2, legend = "bottom", legend.title = "Plaque vulnerability index")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.PlaqueVulnerabilityIndex.byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ Plaque_Vulnerability_Index, group.by = "Gender", data = AERNASE.clin.hdac9, method = "kruskal.test")
p2 <- ggpubr::ggboxplot(AERNASE.clin.hdac9, 
                  x = "Plaque_Vulnerability_Index",
                  y = "HDAC9_max100", 
                  xlab = "Plaque vulnerability index by gender",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format",  method = "kruskal.test")
ggpar(p2, legend = "bottom", legend.title = "Plaque vulnerability index")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".max100.plaque.PlaqueVulnerabilityIndex.byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image

compare_means(HDAC9 ~ Plaque_Vulnerability_Index, data = AERNASE.clin.hdac9, method = "kruskal.test")
p5 <- ggpubr::ggboxplot(AERNASE.clin.hdac9, 
                  x = "Plaque_Vulnerability_Index",
                  y = "HDAC9", 
                  xlab = "Plaque vulnerability index",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Plaque_Vulnerability_Index",
                  palette = "npg",
                  facet.by = "ORyearGroup",
                  add = "jitter") +
  stat_compare_means(label = "p.format",  method = "kruskal.test")
ggpar(p5, legend = "bottom", legend.title = "Plaque vulnerability index")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.PlaqueVulnerabilityIndex_Facet_byYear.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ Plaque_Vulnerability_Index, data = AERNASE.clin.hdac9, method = "kruskal.test")
p5 <- ggpubr::ggboxplot(AERNASE.clin.hdac9, 
                  x = "Plaque_Vulnerability_Index",
                  y = "HDAC9_max100", 
                  xlab = "Plaque vulnerability index",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Plaque_Vulnerability_Index",
                  palette = "npg",
                  facet.by = "ORyearGroup",
                  add = "jitter") +
  stat_compare_means(label = "p.format",  method = "kruskal.test")
ggpar(p5, legend = "bottom", legend.title = "Plaque vulnerability index")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".max100.plaque.PlaqueVulnerabilityIndex_Facet_byYear.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ Plaque_Vulnerability_Index, group.by = "Gender", data = AERNASE.clin.hdac9, method = "kruskal.test")
p6 <- ggpubr::ggboxplot(AERNASE.clin.hdac9, 
                  x = "Plaque_Vulnerability_Index",
                  y = "HDAC9", 
                  xlab = "Plaque vulnerability index",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  facet.by = "ORyearGroup",
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format",  method = "kruskal.test")
ggpar(p6, legend = "bottom", legend.title = "Plaque vulnerability index")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.PlaqueVulnerabilityIndex_Facet_byYear.byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ Plaque_Vulnerability_Index, group.by = "Gender", data = AERNASE.clin.hdac9, method = "kruskal.test")
p6 <- ggpubr::ggboxplot(AERNASE.clin.hdac9, 
                  x = "Plaque_Vulnerability_Index",
                  y = "HDAC9_max100", 
                  xlab = "Plaque vulnerability index",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  facet.by = "ORyearGroup",
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format",  method = "kruskal.test")
ggpar(p6, legend = "bottom", legend.title = "Plaque vulnerability index")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".max100.plaque.PlaqueVulnerabilityIndex_Facet_byYear.byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image

Model 1

In this model we correct for Age, Gender, and year of surgery.

Here we use the inverse-rank normalized data - visually this is more normally distributed.

Analysis of the plaque vulnerability indez as a function of plaque target(s) levels.

TRAITS.TARGET.RANK.extra = c("HDAC9")

GLM.results <- data.frame(matrix(NA, ncol = 16, nrow = 0))
for (protein in 1:length(TRAITS.TARGET.RANK.extra)) {
  PROTEIN = TRAITS.TARGET.RANK.extra[protein]
  cat(paste0("\nAnalysis of ",PROTEIN,".\n"))
  TRAIT = "Plaque_Vulnerability_Index"
    cat(paste0("\n- processing ",TRAIT,"\n\n"))
    currentDF <- as.data.frame(AERNASE.clin.hdac9 %>%
      dplyr::select(., PROTEIN, TRAIT, COVARIATES_M1) %>%
      filter(complete.cases(.))) %>%
      filter_if(~is.numeric(.), all_vars(!is.infinite(.))) %>%
      droplevels(.)
    
    # fix numeric OR year
    # currentDF$ORdate_year <- as.numeric(currentDF$ORdate_year)
    
    # for debug
    # print(DT::datatable(currentDF))
    # print(nrow(currentDF))
    # print(str(currentDF))
    # print(class(currentDF[,TRAIT]))
    # table(currentDF$ORdate_year)
    ### univariate
     # + Hypertension.composite + DiabetesStatus + SmokerCurrent + 
     #            Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + 
     #            CAD_history + Stroke_history + Peripheral.interv + stenose
    # fit <- polr(currentDF[,TRAIT] ~ currentDF[,PROTEIN] + Age + Gender + ORdate_year, 
    #           data  =  currentDF, 
    #           Hess = TRUE)
    fit <- polr(currentDF[,TRAIT] ~ currentDF[,PROTEIN] + Age + Gender + ORdate_epoch, 
              data  =  currentDF, 
              Hess = TRUE)
    print(summary(fit))
    
    ## store table
    (ctable <- coef(summary(fit)))

    ## calculate and store p values
    p <- pnorm(abs(ctable[, "t value"]), lower.tail = FALSE) * 2
    
    ## combined table
    print((ctable <- cbind(ctable, "p value" = p)))
  }

Analysis of HDAC9.

- processing Plaque_Vulnerability_Index
Warning: NaNs produced
Call:
polr(formula = currentDF[, TRAIT] ~ currentDF[, PROTEIN] + Age + 
    Gender + ORdate_epoch, data = currentDF, Hess = TRUE)

Coefficients:
                          Value Std. Error t value
currentDF[, PROTEIN]  0.0069184  0.0026273   2.633
Age                   0.0124750  0.0007876  15.840
Gendermale            0.5460677  0.0029432 185.538
ORdate_epoch         -0.0004384        NaN     NaN

Intercepts:
    Value      Std. Error t value   
0|1    -7.1513     0.0008 -8774.8479
1|2    -5.6841     0.0194  -292.8094
2|3    -4.4752     0.1029   -43.4887
3|4    -2.8315     0.1363   -20.7744
4|5    -1.5179     0.1398   -10.8560

Residual Deviance: 1961.92 
AIC: 1979.92 
Warning: NaNs produced
                            Value   Std. Error      t value      p value
currentDF[, PROTEIN]  0.006918357 0.0026272954     2.633262 8.456907e-03
Age                   0.012475038 0.0007875536    15.840240 1.641938e-56
Gendermale            0.546067650 0.0029431603   185.537858 0.000000e+00
ORdate_epoch         -0.000438398          NaN          NaN          NaN
0|1                  -7.151291599 0.0008149761 -8774.847869 0.000000e+00
1|2                  -5.684099685 0.0194122864  -292.809388 0.000000e+00
2|3                  -4.475156538 0.1029038329   -43.488725 0.000000e+00
3|4                  -2.831470035 0.1362958897   -20.774435 7.372715e-96
4|5                  -1.517922118 0.1398234792   -10.855989 1.867744e-27

Model 2

In this model we correct for Age, Gender, Hypertension status, Diabetes status, current smoker status, lipid-lowering drugs (LLDs), antiplatelet medication, eGFR (MDRD), BMI, MedHx_CVD (combination of CAD history, stroke history, and peripheral interventions), and stenosis..


for (protein in 1:length(TRAITS.TARGET.RANK.extra)) {
  PROTEIN = TRAITS.TARGET.RANK.extra[protein]
  cat(paste0("\nAnalysis of ",PROTEIN,".\n"))
  TRAIT = "Plaque_Vulnerability_Index"
    cat(paste0("\n- processing ",TRAIT,"\n\n"))
    currentDF <- as.data.frame(AERNASE.clin.hdac9 %>%
      dplyr::select(., PROTEIN, TRAIT, COVARIATES_M2) %>%
      filter(complete.cases(.))) %>%
      filter_if(~is.numeric(.), all_vars(!is.infinite(.))) %>%
      droplevels(.)
    
    # fix numeric OR year
    # currentDF$ORdate_year <- as.numeric(currentDF$ORdate_year)
    
    # for debug
    # print(DT::datatable(currentDF))
    # print(nrow(currentDF))
    # print(str(currentDF))
    # print(class(currentDF[,TRAIT]))
    ### univariate

    # fit <- polr(as.factor(currentDF[,TRAIT]) ~ currentDF[,PROTEIN] + Age + Gender + ORdate_year + Hypertension.composite + DiabetesStatus + SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + MedHx_CVD + stenose,
    #           data  =  currentDF,
    #           Hess = TRUE)
    
    fit <- polr(as.factor(currentDF[,TRAIT]) ~ currentDF[,PROTEIN] + Age + Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + MedHx_CVD + stenose,
              data  =  currentDF,
              Hess = TRUE)
    
    print(summary(fit))
    
    ## store table
    (ctable <- coef(summary(fit)))

    ## calculate and store p values
    p <- pnorm(abs(ctable[, "t value"]), lower.tail = FALSE) * 2
    
    ## combined table
    print((ctable <- cbind(ctable, "p value" = p)))
  }

Analysis of HDAC9.

- processing Plaque_Vulnerability_Index
Warning: NaNs produced
Call:
polr(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + ORdate_epoch + Hypertension.composite + DiabetesStatus + 
    SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + MedHx_CVD + stenose, data = currentDF, Hess = TRUE)

Coefficients:
                               Value Std. Error    t value
currentDF[, PROTEIN]        0.007791  2.857e-03  2.727e+00
Age                         0.012450  5.885e-03  2.116e+00
Gendermale                  0.538602  2.577e-03  2.090e+02
ORdate_epoch               -0.000541        NaN        NaN
Hypertension.compositeyes  -0.049872  8.558e-04 -5.828e+01
DiabetesStatusDiabetes     -0.105116  3.196e-04 -3.289e+02
SmokerStatusEx-smoker       0.058168  1.202e-03  4.839e+01
SmokerStatusNever smoked    0.289037  7.098e-04  4.072e+02
Med.Statin.LLDyes           0.062784  1.284e-03  4.891e+01
Med.all.antiplateletyes     0.090098  1.159e-03  7.774e+01
GFR_MDRD                    0.001444  3.393e-03  4.256e-01
BMI                        -0.043742  1.625e-02 -2.691e+00
MedHx_CVDNo                -0.221798  2.329e-03 -9.525e+01
stenose50-70%              -0.521282  2.560e-04 -2.036e+03
stenose70-90%              -0.901200  2.429e-03 -3.711e+02
stenose90-99%              -1.283931  2.446e-03 -5.250e+02
stenose100% (Occlusion)    -1.719726  6.903e-05 -2.491e+04
stenose50-99%             -28.618763  3.029e-11 -9.449e+11

Intercepts:
    Value         Std. Error    t value      
0|1 -1.061660e+01  5.000000e-04 -2.090716e+04
1|2 -9.111700e+00  2.240000e-02 -4.075256e+02
2|3 -7.888900e+00  1.129000e-01 -6.986070e+01
3|4 -6.218700e+00  1.488000e-01 -4.180540e+01
4|5 -4.890200e+00  1.529000e-01 -3.197420e+01

Residual Deviance: 1670.926 
AIC: 1716.926 
Warning: NaNs produced
                                  Value   Std. Error       t value       p value
currentDF[, PROTEIN]       7.791379e-03 2.857069e-03  2.727053e+00  6.390278e-03
Age                        1.244976e-02 5.884999e-03  2.115507e+00  3.438674e-02
Gendermale                 5.386019e-01 2.576587e-03  2.090369e+02  0.000000e+00
ORdate_epoch              -5.409604e-04          NaN           NaN           NaN
Hypertension.compositeyes -4.987198e-02 8.557950e-04 -5.827562e+01  0.000000e+00
DiabetesStatusDiabetes    -1.051157e-01 3.195562e-04 -3.289428e+02  0.000000e+00
SmokerStatusEx-smoker      5.816763e-02 1.202102e-03  4.838828e+01  0.000000e+00
SmokerStatusNever smoked   2.890373e-01 7.098101e-04  4.072037e+02  0.000000e+00
Med.Statin.LLDyes          6.278367e-02 1.283646e-03  4.891042e+01  0.000000e+00
Med.all.antiplateletyes    9.009767e-02 1.158925e-03  7.774248e+01  0.000000e+00
GFR_MDRD                   1.444008e-03 3.392560e-03  4.256395e-01  6.703705e-01
BMI                       -4.374247e-02 1.625429e-02 -2.691134e+00  7.120958e-03
MedHx_CVDNo               -2.217979e-01 2.328509e-03 -9.525319e+01  0.000000e+00
stenose50-70%             -5.212822e-01 2.560112e-04 -2.036169e+03  0.000000e+00
stenose70-90%             -9.012001e-01 2.428538e-03 -3.710875e+02  0.000000e+00
stenose90-99%             -1.283931e+00 2.445602e-03 -5.249956e+02  0.000000e+00
stenose100% (Occlusion)   -1.719726e+00 6.903322e-05 -2.491158e+04  0.000000e+00
stenose50-99%             -2.861876e+01 3.028882e-11 -9.448624e+11  0.000000e+00
0|1                       -1.061656e+01 5.077954e-04 -2.090716e+04  0.000000e+00
1|2                       -9.111703e+00 2.235861e-02 -4.075256e+02  0.000000e+00
2|3                       -7.888915e+00 1.129235e-01 -6.986070e+01  0.000000e+00
3|4                       -6.218676e+00 1.487528e-01 -4.180543e+01  0.000000e+00
4|5                       -4.890208e+00 1.529422e-01 -3.197422e+01 2.489339e-224

Saving data for share

We also want to share the data with our collaborators. And provide some more graphs and summary statistics too.

summary(AERNASE.clin.hdac9$HDAC9)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   0.00   11.00   21.00   28.32   37.00  449.00 
ggpubr::gghistogram(AERNASE.clin.hdac9, x = "HDAC9",
                    color = "Gender", fill = "Gender",
                    add = "mean", add_density = TRUE,
                    xlab = "HDAC9 (normalized expression)",
                    palette = "npg")
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.Histogram.byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
ggpubr::gghistogram(AERNASE.clin.hdac9, x = "HDAC9",
                    color = "Plaque_Vulnerability_Index", fill = "Plaque_Vulnerability_Index",
                    facet.by = "Plaque_Vulnerability_Index",
                    add = "mean", add_density = TRUE,
                    xlab = "HDAC9 (normalized expression)",
                    palette = "npg")
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.Histogram.FacetbyPVI.pdf"), plot = last_plot())
Saving 12 x 8 in image
ggpubr::gghistogram(AERNASE.clin.hdac9, x = "HDAC9",
                    color = "Plaque_Vulnerability_Index", fill = "Plaque_Vulnerability_Index",
                    # facet.by = "Plaque_Vulnerability_Index",
                    add = "mean", add_density = TRUE,
                    xlab = "HDAC9 (normalized expression)",
                    palette = "npg")
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.Histogram.byPVI.pdf"), plot = last_plot())
Saving 12 x 8 in image
ggpubr::gghistogram(AERNASE.clin.hdac9, x = "HDAC9",
                    fill = "black", rug = TRUE,
                    add = "mean", add_density = TRUE,
                    xlab = "HDAC9 (normalized expression)",
                    palette = "npg")
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.Warning: `geom_vline()`: Ignoring `mapping` because `xintercept` was provided.Warning: `geom_vline()`: Ignoring `data` because `xintercept` was provided.

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.Histogram.pdf"), plot = last_plot())
Saving 12 x 8 in image
AERNASE.clin.hdac9.forSHARE <- subset(AERNASE.clin.hdac9, select = c("STUDY_NUMBER", "Age", "Gender", 
                                                                     "HDAC9", "HDAC9_max100", "Plaque_Vulnerability_Index"))
saveRDS(AERNASE.clin.hdac9.forSHARE, file = paste0(OUT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".AERNASE.clin.hdac9.forSHARE.rds"))

fwrite(AERNASE.clin.hdac9.forSHARE, file = paste0(OUT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".AERNASE.clin.hdac9.forSHARE.txt"),
       sep = "\t",
       quote = FALSE,
       na = "NA", 
       verbose = TRUE, showProgress = TRUE, nThread = 8)
No list columns are present. Setting sep2='' otherwise quote='auto' would quote fields containing sep2.
Column writers: 12 5 13 3 5 13 
args.doRowNames=0 args.rowNames=0 doQuote=0 args.nrow=623 args.ncol=6 eolLen=1
maxLineLen=173. Found in 0.000s
Writing bom (false), yaml (0 characters) and column names (true) ... done in 0.000s
Writing 623 rows in 1 batches of 623 rows (each buffer size 8MB, showProgress=1, nth=1)

Plotting HDAC9 vs Fat 10 perc. in the plaque

# Global test
compare_means(HDAC9 ~ Fat.bin_10,  data = AERNASE.clin.hdac9 %>% filter(!is.na(Fat.bin_10)), method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Fat.bin_10)), 
                  x = "Fat.bin_10",
                  y = "HDAC9", 
                  xlab = "Fat <10% vs >10%",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Fat.bin_10",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(label = "p.format",  method = "kruskal.test")
ggpar(p1, legend = "bottom", legend.title = "Fat <10% vs >10%")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.Fat.bin_10.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ Fat.bin_10, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(Fat.bin_10)), method = "kruskal.test")
p2 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Fat.bin_10)), 
                  x = "Fat.bin_10",
                  y = "HDAC9", 
                  xlab = "Fat <10% vs >10% by gender",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format",  method = "kruskal.test")
ggpar(p2, legend = "bottom", legend.title = "Fat <10% vs >10% by gender")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.Fat.bin_10.byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ Fat.bin_10, data = AERNASE.clin.hdac9 %>% filter(!is.na(Fat.bin_10)), method = "kruskal.test")
p5 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Fat.bin_10)), 
                  x = "Fat.bin_10",
                  y = "HDAC9", 
                  xlab = "Fat <10% vs >10% by year of surgery",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Fat.bin_10",
                  palette = "npg",
                  facet.by = "ORyearGroup",
                  add = "jitter") +
  stat_compare_means(label = "p.format",  method = "kruskal.test")
ggpar(p5, legend = "bottom", legend.title = "Fat <10% vs >10% by year of surgery")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.Fat.bin_10_Facet_byYear.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ Fat.bin_10, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(Fat.bin_10)), method = "kruskal.test")
p6 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Fat.bin_10)), 
                  x = "Fat.bin_10",
                  y = "HDAC9", 
                  xlab = "Fat <10% vs >10% by year of surgery and gender",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  facet.by = "ORyearGroup",
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format",  method = "kruskal.test")
ggpar(p6, legend = "bottom", legend.title = "Fat <10% vs >10% by year of surgery and gender")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.Fat.bin_10_Facet_byYear.byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ Fat.bin_10,  data = AERNASE.clin.hdac9 %>% filter(!is.na(Fat.bin_10)), method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Fat.bin_10)), 
                  x = "Fat.bin_10",
                  y = "HDAC9_max100", 
                  xlab = "Fat <10% vs >10%",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Fat.bin_10",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(label = "p.format",  method = "kruskal.test")
ggpar(p1, legend = "bottom", legend.title = "Fat <10% vs >10%")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".max100.plaque.Fat.bin_10.pdf"), plot = last_plot())
Saving 12 x 8 in image

Plotting HDAC9 vs Fat 40 perc. in the plaque

# Global test
compare_means(HDAC9 ~ Fat.bin_40,  data = AERNASE.clin.hdac9 %>% filter(!is.na(Fat.bin_40)), method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Fat.bin_40)), 
                  x = "Fat.bin_40",
                  y = "HDAC9", 
                  xlab = "Fat <40% vs >40%",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Fat.bin_40",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(label = "p.format",  method = "kruskal.test")
ggpar(p1, legend = "bottom", legend.title = "Fat <40% vs >40%")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.Fat.bin_40.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ Fat.bin_40, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(Fat.bin_40)), method = "kruskal.test")
p2 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Fat.bin_40)), 
                  x = "Fat.bin_40",
                  y = "HDAC9", 
                  xlab = "Fat <40% vs >40% by gender",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format",  method = "kruskal.test")
ggpar(p2, legend = "bottom", legend.title = "Fat <40% vs >40% by gender")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.Fat.bin_40.byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ Fat.bin_40, data = AERNASE.clin.hdac9 %>% filter(!is.na(Fat.bin_40)), method = "kruskal.test")
p5 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Fat.bin_40)), 
                  x = "Fat.bin_40",
                  y = "HDAC9", 
                  xlab = "Fat <40% vs >40% by year of surgery",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Fat.bin_40",
                  palette = "npg",
                  facet.by = "ORyearGroup",
                  add = "jitter") +
  stat_compare_means(label = "p.format",  method = "kruskal.test")
ggpar(p5, legend = "bottom", legend.title = "Fat <40% vs >40% by year of surgery")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.Fat.bin_40_Facet_byYear.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ Fat.bin_40, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(Fat.bin_40)), method = "kruskal.test")
p6 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Fat.bin_40)), 
                  x = "Fat.bin_40",
                  y = "HDAC9", 
                  xlab = "Fat <40% vs >40% by year of surgery and gender",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  facet.by = "ORyearGroup",
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format",  method = "kruskal.test")
ggpar(p6, legend = "bottom", legend.title = "Fat <40% vs >40% by year of surgery and gender")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.Fat.bin_40_Facet_byYear.byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
# Global test
compare_means(HDAC9_max100 ~ Fat.bin_40,  data = AERNASE.clin.hdac9 %>% filter(!is.na(Fat.bin_40)), method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Fat.bin_40)), 
                  x = "Fat.bin_40",
                  y = "HDAC9_max100", 
                  xlab = "Fat <40% vs >40%",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Fat.bin_40",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(label = "p.format",  method = "kruskal.test")
ggpar(p1, legend = "bottom", legend.title = "Fat <40% vs >40%")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".max100.plaque.Fat.bin_40.pdf"), plot = last_plot())
Saving 12 x 8 in image

Plotting HDAC9 vs IPH in the plaque

# Global test
compare_means(HDAC9 ~ IPH.bin,  data = AERNASE.clin.hdac9 %>% filter(!is.na(IPH.bin)), method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(IPH.bin)), 
                  x = "IPH.bin",
                  y = "HDAC9", 
                  xlab = "Intraplaque hemorrhage (no vs. yes)",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "IPH.bin",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(label = "p.format",  method = "kruskal.test")
ggpar(p1, legend = "bottom", legend.title = "IPH")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.IPH.bin.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ IPH.bin, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(IPH.bin)), method = "kruskal.test")
p2 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(IPH.bin)), 
                  x = "IPH.bin",
                  y = "HDAC9", 
                  xlab = "Intraplaque hemorrhage (no vs. yes) by gender",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format",  method = "kruskal.test")
ggpar(p2, legend = "bottom", legend.title = "IPH by gender")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.IPH.bin.byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ IPH.bin, data = AERNASE.clin.hdac9 %>% filter(!is.na(IPH.bin)), method = "kruskal.test")
p5 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(IPH.bin)), 
                  x = "IPH.bin",
                  y = "HDAC9", 
                  xlab = "Intraplaque hemorrhage (no vs. yes) by year of surgery",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "IPH.bin",
                  palette = "npg",
                  facet.by = "ORyearGroup",
                  add = "jitter") +
  stat_compare_means(label = "p.format",  method = "kruskal.test")
ggpar(p5, legend = "bottom", legend.title = "IPH by year of surgery")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.IPH.bin_Facet_byYear.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ IPH.bin, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(IPH.bin)), method = "kruskal.test")
p6 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(IPH.bin)), 
                  x = "IPH.bin",
                  y = "HDAC9", 
                  xlab = "Intraplaque hemorrhage (no vs. yes) by year of surgery and gender",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  facet.by = "ORyearGroup",
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format",  method = "kruskal.test")
ggpar(p6, legend = "bottom", legend.title = "IPH by year of surgery and gender")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.IPH.bin_Facet_byYear.byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
# Global test
compare_means(HDAC9_max100 ~ IPH.bin,  data = AERNASE.clin.hdac9 %>% filter(!is.na(IPH.bin)), method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(IPH.bin)), 
                  x = "IPH.bin",
                  y = "HDAC9_max100", 
                  xlab = "Intraplaque hemorrhage (no vs. yes)",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "IPH.bin",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(label = "p.format",  method = "kruskal.test")
ggpar(p1, legend = "bottom", legend.title = "IPH")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".max100.plaque.IPH.bin.pdf"), plot = last_plot())
Saving 12 x 8 in image

Plotting HDAC9 vs Calcification in the plaque

# Global test
compare_means(HDAC9 ~ Calc.bin,  data = AERNASE.clin.hdac9 %>% filter(!is.na(Calc.bin)), method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Calc.bin)), 
                  x = "Calc.bin",
                  y = "HDAC9", 
                  xlab = "Calcification (no/minor vs. moderate/heavy)",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Calc.bin",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(label = "p.format",  method = "kruskal.test")
ggpar(p1, legend = "bottom", legend.title = "Calcification")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.Calc.bin.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ Calc.bin, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(Calc.bin)), method = "kruskal.test")
p2 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Calc.bin)), 
                  x = "Calc.bin",
                  y = "HDAC9", 
                  xlab = "Calcification (no/minor vs. moderate/heavy) by gender",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format",  method = "kruskal.test")
ggpar(p2, legend = "bottom", legend.title = "Calcification by gender")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.Calc.bin.byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ Calc.bin, data = AERNASE.clin.hdac9 %>% filter(!is.na(Calc.bin)), method = "kruskal.test")
p5 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Calc.bin)), 
                  x = "Calc.bin",
                  y = "HDAC9", 
                  xlab = "Calcification (no/minor vs. moderate/heavy) by year of surgery",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Calc.bin",
                  palette = "npg",
                  facet.by = "ORyearGroup",
                  add = "jitter") +
  stat_compare_means(label = "p.format",  method = "kruskal.test")
ggpar(p5, legend = "bottom", legend.title = "Calcification by year of surgery")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.Calc.bin_Facet_byYear.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9 ~ Calc.bin, group.by = "Gender", data = AERNASE.clin.hdac9 %>% filter(!is.na(Calc.bin)), method = "kruskal.test")
p6 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Calc.bin)), 
                  x = "Calc.bin",
                  y = "HDAC9", 
                  xlab = "Calcification (no/minor vs. moderate/heavy) by year of surgery and gender",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  facet.by = "ORyearGroup",
                  add = "jitter") +
  stat_compare_means(aes(group = Gender), label = "p.format",  method = "kruskal.test")
ggpar(p6, legend = "bottom", legend.title = "Calcification by year of surgery and gender")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".plaque.Calc.bin_Facet_byYear.byGender.pdf"), plot = last_plot())
Saving 12 x 8 in image
compare_means(HDAC9_max100 ~ Calc.bin,  data = AERNASE.clin.hdac9 %>% filter(!is.na(Calc.bin)), method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AERNASE.clin.hdac9 %>% filter(!is.na(Calc.bin)), 
                  x = "Calc.bin",
                  y = "HDAC9_max100", 
                  xlab = "Calcification (no/minor vs. moderate/heavy)",
                  ylab = "HDAC9 (normalized expression)\n",
                  color = "Calc.bin",
                  palette = "npg",
                  add = "jitter") +
  stat_compare_means(label = "p.format",  method = "kruskal.test")
ggpar(p1, legend = "bottom", legend.title = "Calcification")

ggsave(filename = paste0(PLOT_loc, "/", Today, ".",TRAIT_OF_INTEREST,".max100.plaque.Calc.bin.pdf"), plot = last_plot())
Saving 12 x 8 in image

Session information


Version:      v1.0.6
Last update:  2023-06-06
Written by:   Sander W. van der Laan (s.w.vanderlaan-2[at]umcutrecht.nl).
Description:  Script to analyse HDAC9 from the Ather-Express Biobank Study.
Minimum requirements: R version 3.5.2 (2018-12-20) -- 'Eggshell Igloo', macOS Mojave (10.14.2).

**MoSCoW To-Do List**
The things we Must, Should, Could, and Would have given the time we have.
_M_

_S_

_C_

_W_

**Changes log**
* v1.0.6 Added maximum counts to HDAC9 in many graphs.
* v1.0.5 Fixed forest plot and alternative boxplot for symptoms.
* v1.0.4 Made histogram of PVI. Exported HDAC9 and PVI data.
* v1.0.3 Small adaptations to PVI-plots.
* v1.0.2 Changed the PVI-plot.
* v1.0.1 Added figures on fat in the plaque.
* v1.0.0 Inital version.

sessionInfo()
R version 4.3.0 (2023-04-21)
Platform: x86_64-apple-darwin22.4.0 (64-bit)
Running under: macOS Ventura 13.5

Matrix products: default
BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib 
LAPACK: /usr/local/Cellar/r/4.3.0_1/lib/R/lib/libRlapack.dylib;  LAPACK version 3.11.0

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

time zone: Europe/Amsterdam
tzcode source: internal

attached base packages:
 [1] grid      tools     stats4    stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] UpSetR_1.4.0                forestplot_3.1.1            abind_1.4-5                 checkmate_2.2.0            
 [5] pheatmap_1.0.12             BlandAltmanLeh_0.3.1        eeptools_1.2.4              pander_0.6.5               
 [9] R.utils_2.12.2              R.oo_1.25.0                 R.methodsS3_1.8.2           credentials_1.3.2          
[13] ggcorrplot_0.1.4.999        openxlsx_4.2.5.2            ggpubr_0.6.0                tableone_0.13.2            
[17] labelled_2.11.0             sjPlot_2.8.14               sjlabelled_1.2.0            haven_2.5.2                
[21] devtools_2.4.5              usethis_2.1.6               MASS_7.3-60                 DT_0.27                    
[25] knitr_1.42                  lubridate_1.9.2             forcats_1.0.0               stringr_1.5.0              
[29] purrr_1.0.1                 tibble_3.2.1                ggplot2_3.4.2               tidyverse_2.0.0            
[33] data.table_1.14.8           naniar_1.0.0                tidyr_1.3.0                 dplyr_1.1.2                
[37] optparse_1.7.3              readr_2.1.4                 rmarkdown_2.21              worcs_0.1.10               
[41] SummarizedExperiment_1.30.1 Biobase_2.60.0              GenomicRanges_1.52.0        GenomeInfoDb_1.36.0        
[45] IRanges_2.34.0              S4Vectors_0.38.1            BiocGenerics_0.46.0         MatrixGenerics_1.12.0      
[49] matrixStats_0.63.0         

loaded via a namespace (and not attached):
  [1] splines_4.3.0           later_1.3.1             bitops_1.0-7            prereg_0.6.0            lifecycle_1.0.3        
  [6] rstatix_0.7.2           gert_1.9.2              processx_3.8.1          lattice_0.21-8          crosstalk_1.2.0        
 [11] insight_0.19.1          vcd_1.4-11              backports_1.4.1         survey_4.2-1            magrittr_2.0.3         
 [16] sass_0.4.6              jquerylib_0.1.4         yaml_2.3.7              remotes_2.4.2           httpuv_1.6.11          
 [21] zip_2.3.0               askpass_1.1             sp_1.6-0                sessioninfo_1.2.2       pkgbuild_1.4.0         
 [26] RColorBrewer_1.1-3      DBI_1.1.3               minqa_1.2.5             multcomp_1.4-23         pkgload_1.3.2          
 [31] zlibbioc_1.46.0         RCurl_1.98-1.12         TH.data_1.1-2           sandwich_3.0-2          GenomeInfoDbData_1.2.10
 [36] arm_1.13-1              performance_0.10.3      codetools_0.2-19        getopt_1.20.3           DelayedArray_0.26.2    
 [41] rticles_0.24            tidyselect_1.2.0        ggeffects_1.2.2         farver_2.1.1            lme4_1.1-33            
 [46] jsonlite_1.8.4          ellipsis_0.3.2          survival_3.5-5          emmeans_1.8.6           systemfonts_1.0.4      
 [51] ragg_1.2.5              Rcpp_1.0.10             glue_1.6.2              gridExtra_2.3           xfun_0.39              
 [56] ranger_0.15.1           withr_2.5.0             fastmap_1.1.1           mitools_2.4             boot_1.3-28.1          
 [61] fansi_1.0.4             openssl_2.0.6           callr_3.7.3             digest_0.6.31           timechange_0.2.0       
 [66] R6_2.5.1                mime_0.12               estimability_1.4.1      visdat_0.6.0            textshaping_0.3.6      
 [71] colorspace_2.1-0        ggsci_3.0.0             utf8_1.2.3              generics_0.1.3          renv_0.17.3            
 [76] prettyunits_1.1.1       htmlwidgets_1.6.2       S4Arrays_1.0.1          pkgconfig_2.0.3         gtable_0.3.3           
 [81] lmtest_0.9-40           XVector_0.40.0          sys_3.4.1               htmltools_0.5.5         carData_3.0-5          
 [86] profvis_0.3.8           scales_1.2.1            rstudioapi_0.14         reshape2_1.4.4          tzdb_0.4.0             
 [91] curl_5.0.0              coda_0.19-4             nlme_3.1-162            nloptr_2.0.3            cachem_1.0.8           
 [96] zoo_1.8-12              miniUI_0.1.1.1          foreign_0.8-84          pillar_1.9.0            vctrs_0.6.2            
[101] urlchecker_1.0.1        promises_1.2.0.1        car_3.1-2               xtable_1.8-4            evaluate_0.21          
[106] maptools_1.1-6          tinytex_0.45            mvtnorm_1.1-3           cli_3.6.1               compiler_4.3.0         
[111] rlang_1.1.1             crayon_1.5.2            ggsignif_0.6.4          modelr_0.1.11           labeling_0.4.2         
[116] ps_1.7.5                plyr_1.8.8              sjmisc_2.8.9            fs_1.6.2                stringi_1.7.12         
[121] munsell_0.5.0           gh_1.4.0                bayestestR_0.13.1       Matrix_1.5-4            sjstats_0.18.2         
[126] hms_1.1.3               shiny_1.7.4             broom_1.0.4             memoise_2.0.1           bslib_0.4.2            

Saving environment

save.image(paste0(PROJECT_loc, "/",Today,".",PROJECTNAME,".bulkRNAseq.additional_figures.RData"))
© 1979-2023 Sander W. van der Laan | s.w.vanderlaan[at]gmail.com | vanderlaan.science. |
LS0tCnRpdGxlOiAiQWRkaXRpb25hbCBGaWd1cmVzIgphdXRob3I6ICdbU2FuZGVyIFcuIHZhbiBkZXIgTGFhbiwgUGhEXShodHRwczovL3ZhbmRlcmxhYW4uc2NpZW5jZSkgfCBzLncudmFuZGVybGFhbkBnbWFpbC5jb20uJwpkYXRlOiAnYHIgU3lzLkRhdGUoKWAnCm91dHB1dDoKICBodG1sX25vdGVib29rOiAKICAgIGNhY2hlOiB5ZXMKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgY29sbGFwc2U6IHllcwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBmaWcuYWxpZ246IGNlbnRlcgogICAgZmlnX2NhcHRpb246IHllcwogICAgZmlnX2hlaWdodDogMTAKICAgIGZpZ19yZXRpbmE6IDIKICAgIGZpZ193aWR0aDogMTIKICAgIHRoZW1lOiBwYXBlcgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBubwogICAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMKICAgIGhpZ2hsaWdodDogdGFuZ28KbWFpbmZvbnQ6IEhlbHZldGljYQpzdWJ0aXRsZTogQWNjb21wYW55aW5nICdQbGFxdWUgZXhwcmVzc2lvbiBsZXZlbHMgb2YgSERBQzkgaW4gYXNzb2NpYXRpb24gd2l0aCBwbGFxdWUgdnVsbmVyYWJpbGl0eSB0cmFpdHMgYW5kIHNlY29uZGFyeSB2YXNjdWxhciBldmVudHMgaW4gcGF0aWVudHMgdW5kZXJnb2luZyBjYXJvdGlkIGVuZGFydGVyZWN0b215LCBhbiBhbmFseXNpcyBpbiB0aGUgQXRoZXJvLUVYUFJFU1MgQmlvYmFuay4nCmVkaXRvcl9vcHRpb25zOgogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKYmlibGlvZ3JhcGh5OiByZWZlcmVuY2VzLmJpYgprbml0OiB3b3Jjczo6Y2l0ZV9hbGwKLS0tCiMgR2VuZXJhbCBTZXR1cAoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CiMgV2UgcmVjb21tZW5kIHRoYXQgeW91IHByZXBhcmUgeW91ciByYXcgZGF0YSBmb3IgYW5hbHlzaXMgaW4gJ3ByZXBhcmVfZGF0YS5SJywKIyBhbmQgZW5kIHRoYXQgZmlsZSB3aXRoIGVpdGhlciBvcGVuX2RhdGEoeW91cmRhdGEpLCBvciBjbG9zZWRfZGF0YSh5b3VyZGF0YSkuCiMgVGhlbiwgdW5jb21tZW50IHRoZSBsaW5lIGJlbG93IHRvIGxvYWQgdGhlIG9yaWdpbmFsIG9yIHN5bnRoZXRpYyBkYXRhCiMgKHdoaWNoZXZlciBpcyBhdmFpbGFibGUpLCB0byBhbGxvdyBhbnlvbmUgdG8gcmVwcm9kdWNlIHlvdXIgY29kZToKIyBsb2FkX2RhdGEoKQoKIyBmdXJ0aGVyIGRlZmluZSBzb21lIGtuaXRyLW9wdGlvbnMuCmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDgsIGZpZy5wYXRoID0gJ0ZpZ3VyZXMvJywgCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gVFJVRSwgIyBzaG93IHdhcm5pbmdzIGR1cmluZyBjb2RlYm9vayBnZW5lcmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gVFJVRSwgIyBzaG93IG1lc3NhZ2VzIGR1cmluZyBjb2RlYm9vayBnZW5lcmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IFRSVUUsICMgZG8gbm90IGludGVycnVwdCBjb2RlYm9vayBnZW5lcmF0aW9uIGluIGNhc2Ugb2YgZXJyb3JzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1c3VhbGx5IGJldHRlciBmb3IgZGVidWdnaW5nCiAgICAgICAgICAgICAgICAgICAgICBlY2hvID0gVFJVRSwgICMgc2hvdyBSIGNvZGUKICAgICAgICAgICAgICAgICAgICAgIGV2YWwgPSBUUlVFKQoKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX21pbmltYWwoKSkKIyBwYW5kZXI6OnBhbmRlck9wdGlvbnMoInRhYmxlLnNwbGl0LnRhYmxlIiwgSW5mKQpsaWJyYXJ5KCJ3b3JjcyIpCmxpYnJhcnkoInJtYXJrZG93biIpCgpgYGAKCmBgYHtyIGVjaG8gPSBGQUxTRX0Kcm0obGlzdCA9IGxzKCkpCmBgYAoKYGBge3IgTG9jYWxTeXN0ZW0sIGVjaG8gPSBGQUxTRX0Kc291cmNlKCJzY3JpcHRzL2xvY2FsLnN5c3RlbS5SIikKCmBgYAoKYGBge3IgU291cmNlIGZ1bmN0aW9uc30Kc291cmNlKHBhc3RlMChQUk9KRUNUX2xvYywgIi9zY3JpcHRzL2Z1bmN0aW9ucy5SIikpCmBgYAoKYGBge3IgU2V0dGluZzogbG9hZGluZ19wYWNrYWdlcywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kc291cmNlKHBhc3RlMChQUk9KRUNUX2xvYywgIi9zY3JpcHRzL3BhY2swMS5wYWNrYWdlcy5SIikpCgpgYGAKCmBgYHtyIFNldHRpbmc6IENvbG9ycywgaW5jbHVkZSA9IEZBTFNFfQpzb3VyY2UocGFzdGUwKFBST0pFQ1RfbG9jLCAiL3NjcmlwdHMvY29sb3JzLlIiKSkKYGBgCgoKIyBCYWNrZ3JvdW5kCgpUaGlzIG5vdGVib29rIGNvbnRhaW5zIGFkZGl0aW9uYWwgZmlndXJlcyBvZiB0aGUgcHJvamVjdCAiUGxhcXVlIGV4cHJlc3Npb24gbGV2ZWxzIG9mIF9IREFDOV8gaW4gYXNzb2NpYXRpb24gd2l0aCBwbGFxdWUgdnVsbmVyYWJpbGl0eSB0cmFpdHMgYW5kIHNlY29uZGFyeSB2YXNjdWxhciBldmVudHMgaW4gcGF0aWVudHMgdW5kZXJnb2luZyBjYXJvdGlkIGVuZGFydGVyZWN0b215OiBhbiBhbmFseXNpcyBpbiB0aGUgQXRoZXJvLUVYUFJFU1MgQmlvYmFuay4iLgoKCiMgTG9hZGluZyBkYXRhCgpgYGB7ciBMb2FkaW5nIHByb2plY3QgZGF0YX0KIyBsb2FkKHBhc3RlMChQUk9KRUNUX2xvYywgIi8iLFRvZGF5LCIuIixQUk9KRUNUTkFNRSwiLmJ1bGtSTkFzZXEubWFpbl9hbmFseXNpcy5SRGF0YSIpKQpsb2FkKHBhc3RlMChQUk9KRUNUX2xvYywgIi8yMDIyMDMxOS4iLFBST0pFQ1ROQU1FLCIuYnVsa1JOQXNlcS5tYWluX2FuYWx5c2lzLlJEYXRhIikpCmBgYAoKYGBge3J9CnNvdXJjZSgiL1VzZXJzL3NsYWFuMy9naXQvQ2lyY3VsYXRvcnlIZWFsdGgvQUVfMjAyMTEyMDFfWUFXX1NXVkFOREVSTEFBTl9IREFDOS9zY3JpcHRzL2xvY2FsLnN5c3RlbS5SIikKVG9kYXkgPSBmb3JtYXQoYXMuRGF0ZShhcy5QT1NJWGx0KFN5cy50aW1lKCkpKSwgIiVZJW0lZCIpClRvZGF5LlJlcG9ydCA9IGZvcm1hdChhcy5EYXRlKGFzLlBPU0lYbHQoU3lzLnRpbWUoKSkpLCAiJUEsICVCICVkLCAlWSIpCgpgYGAKCgojIEZpeCBzb21lIHZhcmlhYmxlcwoKV2UgbmVlZCB0byBnZXQgdGhlICdjb252ZW50aW9uYWwgdW5pdCcgdmVyc2lvbnMgb2YgY2hvbGVzdGVyb2xzLgoKYGBge3J9CkFFUk5BU0UuY2xpbi5oZGFjOSA8LSBtZXJnZShBRVJOQVNFLmNsaW4uaGRhYzksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2V0KEFFREIuQ0VBLCBzZWxlY3QgPSBjKCJTVFVEWV9OVU1CRVIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmlzazYxNCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMRExfZmluYWxDVSIsICJIRExfZmluYWxDVSIsICJUQ19maW5hbENVIiwgIlRHX2ZpbmFsQ1UiKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkueCA9ICJTVFVEWV9OVU1CRVIiLCBieS55ID0gIlNUVURZX05VTUJFUiIsIHNvcnQgPSBUUlVFLCBhbGwueCA9IFRSVUUpCmBgYAoKCiMgRml4IGNvdW50cwoKV2UgbGltaXQgdGhlIG1heGltdW0gY291bnQgYXQgMTAwLiAKYGBge3J9CiMgP2dncHVicjo6Z2dib3hwbG90KCkKIyBjb21wYXJlX21lYW5zKExSQ0gxIH4gZUdGUkdyb3VwLCBkYXRhID0gQUVSTkFTRS5jbGluICU+JSBmaWx0ZXIoIWlzLm5hKGVHRlJHcm91cCkpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKIyBnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4gJT4lIGZpbHRlcighaXMubmEoZUdGUkdyb3VwKSkKCmNhdCgiR2V0IHN1bW1hcnkgc3RhdGlzdGljcyBmb3IgdGFyZ2V0OlxuIikKc3VtbWFyeShBRVJOQVNFLmNsaW4uaGRhYzkkSERBQzkpCgpjYXQoIlxuQ291bnQgbnVtYmVyIG9mIHZhbHVlcyA+IDEwMCBmb3IgdGFyZ2V0OlxuIikKc3VtKEFFUk5BU0UuY2xpbi5oZGFjOSRIREFDOSA+IDEwMCkKCmNhdCgiXG5TZXR0aW5nIHZhbHVlcyA+IDEwMCBmb3IgdGFyZ2V0IHRvIDEwMC5cbiIpCkFFUk5BU0UuY2xpbi5oZGFjOSA8LSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIG11dGF0ZShIREFDOV9tYXgxMDAgPSBpZmVsc2UoSERBQzkgPiAxMDAsIDEwMCwgSERBQzkpKSAKCmNhdCgiR2V0IHN1bW1hcnkgc3RhdGlzdGljcyBmb3IgdGFyZ2V0IGFmdGVyIGZpeGluZyB2YWx1ZXM6XG4iKQpzdW1tYXJ5KEFFUk5BU0UuY2xpbi5oZGFjOSRIREFDOV9tYXgxMDApCmBgYAoKIyBBZGRpdGlvbmFsIGZpZ3VyZXMKCiMjIEFnZSBhbmQgc2V4CldlIHdhbnQgdG8gY3JlYXRlIHBlci1hZ2UtZ3JvdXAgZmlndXJlcyBtZWRpYW4gwrEgaW50ZXJxdWFydGlsZSByYW5nZS4gCgotIEJveCBhbmQgV2hpc2tlciBwbG90IGZvciB0YXJnZXQocykgcGxhcXVlIGxldmVscyBieSBzZXguCi0gQm94IGFuZCBXaGlza2VyIHBsb3QgZm9yIHRhcmdldChzKSBwbGFxdWUgbGV2ZWxzIGJ5IChzZXggYW5kKSBhZ2UgZ3JvdXAgKDw1NSwgNTUtNjQsIDY1LTc0LCA3NS04NCwgODUrKS4KCgpgYGB7ciBwZXIgU2V4fQoKIyA/Z2dwdWJyOjpnZ2JveHBsb3QoKQpjb21wYXJlX21lYW5zKEhEQUM5IH4gR2VuZGVyLCAgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJHZW5kZXIiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gImdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IEdlbmRlciksIGxhYmVsID0gInAuZm9ybWF0IiwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLnBsYXF1ZS5HZW5kZXIucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmNvbXBhcmVfbWVhbnMoSERBQzlfbWF4MTAwIH4gR2VuZGVyLCAgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJHZW5kZXIiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOV9tYXgxMDAiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhhZXMoZ3JvdXAgPSBHZW5kZXIpLCBsYWJlbCA9ICJwLmZvcm1hdCIsIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3NhdmUoZmlsZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLFRvZGF5LCIuQUVSTkFTRS5jbGluLmhkYWM5LiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5tYXgxMDAucGxhcXVlLkdlbmRlci5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKYGBgCgoKYGBge3IgQWdlR3JvdXBzfQpsaWJyYXJ5KGRwbHlyKQoKQUVSTkFTRS5jbGluLmhkYWM5IDwtIEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZHBseXI6Om11dGF0ZShBZ2VHcm91cCA9IGZhY3RvcihjYXNlX3doZW4oQWdlIDwgNTUgfiAiPDU1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2UgPj0gNTUgICYgQWdlIDw9IDY0IH4gIjU1LTY0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2UgPj0gNjUgICYgQWdlIDw9IDc0IH4gIjY1LTc0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2UgPj0gNzUgICYgQWdlIDw9IDg0IH4gIjc1LTg0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2UgPj0gODUgfiAiODUrIikpKSAKCkFFUk5BU0UuY2xpbi5oZGFjOSA8LSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGRwbHlyOjptdXRhdGUoQWdlR3JvdXBTZXggPSBmYWN0b3IoY2FzZV93aGVuKEFnZSA8IDU1ICYgR2VuZGVyID09ICJtYWxlIiB+ICI8NTUgbWFsZXMiICwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2UgPj0gNTUgICYgQWdlIDw9IDY0ICYgR2VuZGVyID09ICJtYWxlIn4gIjU1LTY0IG1hbGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2UgPj0gNjUgICYgQWdlIDw9IDc0ICYgR2VuZGVyID09ICJtYWxlIn4gIjY1LTc0IG1hbGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2UgPj0gNzUgICYgQWdlIDw9IDg0ICYgR2VuZGVyID09ICJtYWxlIn4gIjc1LTg0IG1hbGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2UgPj0gODUgJiBHZW5kZXIgPT0gIm1hbGUifiAiODUrIG1hbGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2UgPCA1NSAmIEdlbmRlciA9PSAiZmVtYWxlIiB+ICI8NTUgZmVtYWxlcyIgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZSA+PSA1NSAgJiBBZ2UgPD0gNjQgJiBHZW5kZXIgPT0gImZlbWFsZSJ+ICI1NS02NCBmZW1hbGVzICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdlID49IDY1ICAmIEFnZSA8PSA3NCAmIEdlbmRlciA9PSAiZmVtYWxlIn4gIjY1LTc0IGZlbWFsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZSA+PSA3NSAgJiBBZ2UgPD0gODQgJiBHZW5kZXIgPT0gImZlbWFsZSJ+ICI3NS04NCBmZW1hbGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2UgPj0gODUgJiBHZW5kZXIgPT0gImZlbWFsZSJ+ICI4NSsgZmVtYWxlcyIpKSkKCnRhYmxlKEFFUk5BU0UuY2xpbi5oZGFjOSRBZ2VHcm91cCwgQUVSTkFTRS5jbGluLmhkYWM5JEdlbmRlcikKdGFibGUoQUVSTkFTRS5jbGluLmhkYWM5JEFnZUdyb3VwU2V4KQoKYGBgCgpOb3cgd2UgY2FuIGRyYXcgc29tZSBncmFwaHMgb2YgcGxhcXVlIHRhcmdldChzKSBsZXZlbHMgcGVyIHNleCBhbmQgYWdlIGdyb3VwIGFzIG1lZGlhbiDCsSBpbnRlcnF1YXJ0aWxlIHJhbmdlLgoKYGBge3IgcGVyIEFnZUdyb3VwIHBlciBTZXh9CgojID9nZ3B1YnI6OmdnYm94cGxvdCgpCmNvbXBhcmVfbWVhbnMoSERBQzkgfiBBZ2VHcm91cCwgIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzksIAogICAgICAgICAgICAgICAgICB4ID0gYygiQWdlR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkFnZSBncm91cHMgKHllYXJzKSIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJBZ2VHcm91cCIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAibnBnIiwKICAgICAgICAgICAgICAgICAgIyBhZGQgPSAibWVkaWFuX2lxciIpCiAgICAgICAgICAgICAgICAgIGFkZCA9IGMoIm1lZGlhbl9pcXIiLCAiaml0dGVyIikpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoYWVzKGdyb3VwID0gQWdlR3JvdXApLCBsYWJlbCA9ICJwLmZvcm1hdCIsIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3NhdmUoZmlsZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLFRvZGF5LCIuQUVSTkFTRS5jbGluLmhkYWM5LiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5wbGFxdWUuQWdlR3JvdXAucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmNvbXBhcmVfbWVhbnMoSERBQzkgfiBBZ2VHcm91cCwgZ3JvdXAuYnkgPSAiR2VuZGVyIiwgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJBZ2VHcm91cCIpLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5IiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiQWdlIGdyb3VwcyAoeWVhcnMpIHBlciBnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgICMgYWRkID0gIm1lZGlhbl9pcXIiKQogICAgICAgICAgICAgICAgICBhZGQgPSBjKCJtZWRpYW5faXFyIiwgImppdHRlciIpKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IEdlbmRlciksIGxhYmVsID0gInAuZm9ybWF0IiwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLnBsYXF1ZS5BZ2VHcm91cF9wZXJHZW5kZXIucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCiMgP2dncHVicjo6Z2dib3hwbG90KCkKY29tcGFyZV9tZWFucyhIREFDOV9tYXgxMDAgfiBBZ2VHcm91cCwgIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzksIAogICAgICAgICAgICAgICAgICB4ID0gYygiQWdlR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOV9tYXgxMDAiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJBZ2UgZ3JvdXBzICh5ZWFycykiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiQWdlR3JvdXAiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgICMgYWRkID0gIm1lZGlhbl9pcXIiKQogICAgICAgICAgICAgICAgICBhZGQgPSBjKCJtZWRpYW5faXFyIiwgImppdHRlciIpKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IEFnZUdyb3VwKSwgbGFiZWwgPSAicC5mb3JtYXQiLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIubWF4MTAwLnBsYXF1ZS5BZ2VHcm91cC5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKY29tcGFyZV9tZWFucyhIREFDOV9tYXgxMDAgfiBBZ2VHcm91cCwgZ3JvdXAuYnkgPSAiR2VuZGVyIiwgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJBZ2VHcm91cCIpLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5X21heDEwMCIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkFnZSBncm91cHMgKHllYXJzKSBwZXIgZ2VuZGVyIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICAjIGFkZCA9ICJtZWRpYW5faXFyIikKICAgICAgICAgICAgICAgICAgYWRkID0gYygibWVkaWFuX2lxciIsICJqaXR0ZXIiKSkgKwogIHN0YXRfY29tcGFyZV9tZWFucyhhZXMoZ3JvdXAgPSBHZW5kZXIpLCBsYWJlbCA9ICJwLmZvcm1hdCIsIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3NhdmUoZmlsZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLFRvZGF5LCIuQUVSTkFTRS5jbGluLmhkYWM5LiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5tYXgxMDAucGxhcXVlLkFnZUdyb3VwX3BlckdlbmRlci5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKYGBgCgoKIyMgSHlwZXJ0ZW5zaW9uICYgYmxvb2QgcHJlc3N1cmUKV2Ugd2FudCB0byBjcmVhdGUgZmlndXJlcyBvZiB0YXJnZXQocykgbGV2ZWxzIHN0cmF0aWZpZWQgYnkgaHlwZXJ0ZW5zaW9uL2Jsb29kIHByZXNzdXJlLCBhbmQgdXNlIG9mIGFudGktaHlwZXJ0ZW5zaXZlIGRydWdzLiAKCi0gQm94IGFuZCBXaGlza2VyIHBsb3QgZm9yIHRhcmdldChzKSBwbGFxdWUgbGV2ZWxzIGJ5IGh5cGVydGVuc2lvbiBncm91cCAobm8sIHllcykKLSBCb3ggYW5kIFdoaXNrZXIgcGxvdCBmb3IgdGFyZ2V0KHMpIHBsYXF1ZSBsZXZlbHMgYnkgc3lzdG9saWMgYmxvb2QgcHJlc3N1cmUgZ3JvdXAgKDwxMjAsIDEyMC0xMzksIDE0MC0xNTksMTYwKykKCgpgYGB7ciBCbG9vZFByZXNzdXJlfQpsaWJyYXJ5KGRwbHlyKQoKQUVSTkFTRS5jbGluLmhkYWM5IDwtIEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgbXV0YXRlKFNCUEdyb3VwID0gZmFjdG9yKGNhc2Vfd2hlbihzeXN0b2xpYyA8IDEyMCB+ICI8MTIwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0b2xpYyA+PSAxMjAgICYgc3lzdG9saWMgPD0gMTM5IH4gIjEyMC0xMzkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RvbGljID49IDE0MCAgJiBzeXN0b2xpYyA8PSAxNTkgfiAiMTQwLTE1OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzdG9saWMgPj0gMTYwIH4gIjE2MCsiKSkpIAoKdGFibGUoQUVSTkFTRS5jbGluLmhkYWM5JFNCUEdyb3VwLCBBRVJOQVNFLmNsaW4uaGRhYzkkR2VuZGVyKQoKYGBgCgpOb3cgd2UgY2FuIGRyYXcgc29tZSBncmFwaHMgb2YgcGxhcXVlIHRhcmdldChzKSBsZXZlbHMgcGVyIHNleCBhbmQgaHlwZXJ0ZW5zaW9uL2Jsb29kIHByZXNzdXJlIGdyb3VwIGFzIG1lZGlhbiDCsSBpbnRlcnF1YXJ0aWxlIHJhbmdlLgoKYGBge3IgcGVyIEJsb29kUHJlc3N1cmUgcGVyIFNleH0KY29tcGFyZV9tZWFucyhIREFDOSB+IFNCUEdyb3VwLCBkYXRhID0gQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKFNCUEdyb3VwKSksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoU0JQR3JvdXApKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJTQlBHcm91cCIpLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5IiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiU3lzdG9saWMgYmxvb2QgcHJlc3N1cmUgKG1tSGcpIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIlNCUEdyb3VwIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJucGciLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhhZXMoZ3JvdXAgPSBTQlBHcm91cCksIGxhYmVsID0gInAuZm9ybWF0IiwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLnBsYXF1ZS5TQlBHcm91cC5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKY29tcGFyZV9tZWFucyhIREFDOSB+IEh5cGVydGVuc2lvbi5zZWxmcmVwb3J0LCBkYXRhID0gQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKEh5cGVydGVuc2lvbi5zZWxmcmVwb3J0KSksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQpKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJIeXBlcnRlbnNpb24uc2VsZnJlcG9ydCIpLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5IiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiU2VsZi1yZXBvcnRlZCBoeXBlcnRlbnNpb24iLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IEh5cGVydGVuc2lvbi5zZWxmcmVwb3J0KSwgbGFiZWwgPSAicC5mb3JtYXQiLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIucGxhcXVlLkh5cGVydGVuc2lvbi5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKY29tcGFyZV9tZWFucyhIREFDOSB+IEh5cGVydGVuc2lvbi5kcnVncywgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShIeXBlcnRlbnNpb24uZHJ1Z3MpKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShIeXBlcnRlbnNpb24uZHJ1Z3MpKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJIeXBlcnRlbnNpb24uZHJ1Z3MiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkh5cGVydGVuc2lvbiBtZWRpY2F0aW9uIHVzZSIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJIeXBlcnRlbnNpb24uZHJ1Z3MiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IEh5cGVydGVuc2lvbi5kcnVncyksIGxhYmVsID0gInAuZm9ybWF0IiwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLnBsYXF1ZS5IeXBlcnRlbnNpb25EcnVncy5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKCgpjb21wYXJlX21lYW5zKEhEQUM5IH4gU0JQR3JvdXAsIGdyb3VwLmJ5ID0gIkdlbmRlciIsIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoU0JQR3JvdXApKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShTQlBHcm91cCkpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIlNCUEdyb3VwIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzkiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJTeXN0b2xpYyBibG9vZCBwcmVzc3VyZSAobW1IZykgcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IEdlbmRlciksIGxhYmVsID0gInAuZm9ybWF0IiwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLnBsYXF1ZS5TQlBHcm91cF9ieUdlbmRlci5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKY29tcGFyZV9tZWFucyhIREFDOSB+IEh5cGVydGVuc2lvbi5zZWxmcmVwb3J0LCBncm91cC5ieSA9ICJHZW5kZXIiLCBkYXRhID0gQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKEh5cGVydGVuc2lvbi5zZWxmcmVwb3J0KSksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQpKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJIeXBlcnRlbnNpb24uc2VsZnJlcG9ydCIpLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5IiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiU2VsZi1yZXBvcnRlZCBoeXBlcnRlbnNpb24gcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IEdlbmRlciksIGxhYmVsID0gInAuZm9ybWF0IiwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLnBsYXF1ZS5IeXBlcnRlbnNpb25fYnlHZW5kZXIucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmNvbXBhcmVfbWVhbnMoSERBQzkgfiBIeXBlcnRlbnNpb24uZHJ1Z3MsIGdyb3VwLmJ5ID0gIkdlbmRlciIsIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoSHlwZXJ0ZW5zaW9uLmRydWdzKSksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoSHlwZXJ0ZW5zaW9uLmRydWdzKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiSHlwZXJ0ZW5zaW9uLmRydWdzIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzkiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJIeXBlcnRlbnNpb24gbWVkaWNhdGlvbiB1c2UgcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IEdlbmRlciksIGxhYmVsID0gInAuZm9ybWF0IiwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLnBsYXF1ZS5IeXBlcnRlbnNpb24uZHJ1Z3NfYnlHZW5kZXIucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCgoKY29tcGFyZV9tZWFucyhIREFDOSB+IFNCUEdyb3VwLCBncm91cC5ieSA9ICJIeXBlcnRlbnNpb24uZHJ1Z3MiLCBkYXRhID0gQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKFNCUEdyb3VwKSAmICFpcy5uYShIeXBlcnRlbnNpb24uZHJ1Z3MpKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShTQlBHcm91cCkgJiAhaXMubmEoSHlwZXJ0ZW5zaW9uLmRydWdzKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiU0JQR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIlN5c3RvbGljIGJsb29kIHByZXNzdXJlIChtbUhnKSBieSBtZWRpY2F0aW9uIHVzZSIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJIeXBlcnRlbnNpb24uZHJ1Z3MiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiIzQ5QTAxRCIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IEh5cGVydGVuc2lvbi5kcnVncyksIGxhYmVsID0gInAuZm9ybWF0IiwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLnBsYXF1ZS5TQlBHcm91cF9ieUh5cGVydGVuc2lvbkRydWdzLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgpjb21wYXJlX21lYW5zKEhEQUM5IH4gSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQsIGdyb3VwLmJ5ID0gIkh5cGVydGVuc2lvbi5kcnVncyIsIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQpICYgIWlzLm5hKEh5cGVydGVuc2lvbi5kcnVncykpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKEh5cGVydGVuc2lvbi5zZWxmcmVwb3J0KSAmICFpcy5uYShIeXBlcnRlbnNpb24uZHJ1Z3MpKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJIeXBlcnRlbnNpb24uc2VsZnJlcG9ydCIpLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5IiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiU2VsZi1yZXBvcnRlZCBoeXBlcnRlbnNpb24gcGVyIG1lZGljYXRpb24gdXNlIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkh5cGVydGVuc2lvbi5kcnVncyIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjNDlBMDFEIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoYWVzKGdyb3VwID0gSHlwZXJ0ZW5zaW9uLmRydWdzKSwgbGFiZWwgPSAicC5mb3JtYXQiLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIucGxhcXVlLkh5cGVydGVuc2lvbi5zZWxmcmVwb3J0X2J5SHlwZXJ0ZW5zaW9uRHJ1Z3MucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmBgYAoKYGBge3IgcGVyIEJsb29kUHJlc3N1cmUgcGVyIFNleCBIREFDOV9tYXgxMDB9CmNvbXBhcmVfbWVhbnMoSERBQzlfbWF4MTAwIH4gU0JQR3JvdXAsIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoU0JQR3JvdXApKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShTQlBHcm91cCkpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIlNCUEdyb3VwIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzlfbWF4MTAwIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiU3lzdG9saWMgYmxvb2QgcHJlc3N1cmUgKG1tSGcpIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIlNCUEdyb3VwIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJucGciLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhhZXMoZ3JvdXAgPSBTQlBHcm91cCksIGxhYmVsID0gInAuZm9ybWF0IiwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLm1heDEwMC5wbGFxdWUuU0JQR3JvdXAucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmNvbXBhcmVfbWVhbnMoSERBQzlfbWF4MTAwIH4gSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQsIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQpKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShIeXBlcnRlbnNpb24uc2VsZnJlcG9ydCkpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkh5cGVydGVuc2lvbi5zZWxmcmVwb3J0IiksCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzlfbWF4MTAwIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiU2VsZi1yZXBvcnRlZCBoeXBlcnRlbnNpb24iLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IEh5cGVydGVuc2lvbi5zZWxmcmVwb3J0KSwgbGFiZWwgPSAicC5mb3JtYXQiLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIubWF4MTAwLnBsYXF1ZS5IeXBlcnRlbnNpb24ucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmNvbXBhcmVfbWVhbnMoSERBQzlfbWF4MTAwIH4gSHlwZXJ0ZW5zaW9uLmRydWdzLCBkYXRhID0gQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKEh5cGVydGVuc2lvbi5kcnVncykpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKEh5cGVydGVuc2lvbi5kcnVncykpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkh5cGVydGVuc2lvbi5kcnVncyIpLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5X21heDEwMCIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkh5cGVydGVuc2lvbiBtZWRpY2F0aW9uIHVzZSIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJIeXBlcnRlbnNpb24uZHJ1Z3MiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IEh5cGVydGVuc2lvbi5kcnVncyksIGxhYmVsID0gInAuZm9ybWF0IiwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLm1heDEwMC5wbGFxdWUuSHlwZXJ0ZW5zaW9uRHJ1Z3MucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCgoKY29tcGFyZV9tZWFucyhIREFDOV9tYXgxMDAgfiBTQlBHcm91cCwgZ3JvdXAuYnkgPSAiR2VuZGVyIiwgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShTQlBHcm91cCkpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKFNCUEdyb3VwKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiU0JQR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOV9tYXgxMDAiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJTeXN0b2xpYyBibG9vZCBwcmVzc3VyZSAobW1IZykgcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IEdlbmRlciksIGxhYmVsID0gInAuZm9ybWF0IiwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLm1heDEwMC5wbGFxdWUuU0JQR3JvdXBfYnlHZW5kZXIucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmNvbXBhcmVfbWVhbnMoSERBQzlfbWF4MTAwIH4gSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQsIGdyb3VwLmJ5ID0gIkdlbmRlciIsIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQpKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShIeXBlcnRlbnNpb24uc2VsZnJlcG9ydCkpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkh5cGVydGVuc2lvbi5zZWxmcmVwb3J0IiksCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzlfbWF4MTAwIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiU2VsZi1yZXBvcnRlZCBoeXBlcnRlbnNpb24gcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IEdlbmRlciksIGxhYmVsID0gInAuZm9ybWF0IiwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLm1heDEwMC5wbGFxdWUuSHlwZXJ0ZW5zaW9uX2J5R2VuZGVyLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgpjb21wYXJlX21lYW5zKEhEQUM5X21heDEwMCB+IEh5cGVydGVuc2lvbi5kcnVncywgZ3JvdXAuYnkgPSAiR2VuZGVyIiwgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShIeXBlcnRlbnNpb24uZHJ1Z3MpKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShIeXBlcnRlbnNpb24uZHJ1Z3MpKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJIeXBlcnRlbnNpb24uZHJ1Z3MiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOV9tYXgxMDAiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJIeXBlcnRlbnNpb24gbWVkaWNhdGlvbiB1c2UgcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IEdlbmRlciksIGxhYmVsID0gInAuZm9ybWF0IiwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLm1heDEwMC5wbGFxdWUuSHlwZXJ0ZW5zaW9uLmRydWdzX2J5R2VuZGVyLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgoKCmNvbXBhcmVfbWVhbnMoSERBQzlfbWF4MTAwIH4gU0JQR3JvdXAsIGdyb3VwLmJ5ID0gIkh5cGVydGVuc2lvbi5kcnVncyIsIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoU0JQR3JvdXApICYgIWlzLm5hKEh5cGVydGVuc2lvbi5kcnVncykpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKFNCUEdyb3VwKSAmICFpcy5uYShIeXBlcnRlbnNpb24uZHJ1Z3MpKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJTQlBHcm91cCIpLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5X21heDEwMCIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIlN5c3RvbGljIGJsb29kIHByZXNzdXJlIChtbUhnKSBieSBtZWRpY2F0aW9uIHVzZSIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJIeXBlcnRlbnNpb24uZHJ1Z3MiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiIzQ5QTAxRCIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IEh5cGVydGVuc2lvbi5kcnVncyksIGxhYmVsID0gInAuZm9ybWF0IiwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLm1heDEwMC5wbGFxdWUuU0JQR3JvdXBfYnlIeXBlcnRlbnNpb25EcnVncy5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKY29tcGFyZV9tZWFucyhIREFDOV9tYXgxMDAgfiBIeXBlcnRlbnNpb24uc2VsZnJlcG9ydCwgZ3JvdXAuYnkgPSAiSHlwZXJ0ZW5zaW9uLmRydWdzIiwgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShIeXBlcnRlbnNpb24uc2VsZnJlcG9ydCkgJiAhaXMubmEoSHlwZXJ0ZW5zaW9uLmRydWdzKSksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQpICYgIWlzLm5hKEh5cGVydGVuc2lvbi5kcnVncykpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkh5cGVydGVuc2lvbi5zZWxmcmVwb3J0IiksCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzlfbWF4MTAwIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiU2VsZi1yZXBvcnRlZCBoeXBlcnRlbnNpb24gcGVyIG1lZGljYXRpb24gdXNlIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkh5cGVydGVuc2lvbi5kcnVncyIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjNDlBMDFEIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoYWVzKGdyb3VwID0gSHlwZXJ0ZW5zaW9uLmRydWdzKSwgbGFiZWwgPSAicC5mb3JtYXQiLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIubWF4MTAwLnBsYXF1ZS5IeXBlcnRlbnNpb24uc2VsZnJlcG9ydF9ieUh5cGVydGVuc2lvbkRydWdzLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgpgYGAKCgojIyBIeXBlcmNob2xlc3Rlcm9sZW1pYSAmIExETCBsZXZlbHMKV2Ugd2FudCB0byBjcmVhdGUgZmlndXJlcyBvZiB0YXJnZXQocykgbGV2ZWxzIHN0cmF0aWZpZWQgYnkgaHlwZXJjaG9sZXN0ZXJvbGVtaWEvTERMLWxldmVscywgYW5kIHVzZSBvZiBsaXBpZC1sb3dlcmluZyBkcnVncy4gCgotIEJveCBhbmQgV2hpc2tlciBwbG90IGZvciB0YXJnZXQocykgcGxhcXVlIGxldmVscyBieSBoeXBlcmNob2xlc3Rlcm9sZW1pYSAoYHJpc2s2MTRgKSBncm91cCAobm8sIHllcykKLSBCb3ggYW5kIFdoaXNrZXIgcGxvdCBmb3IgdGFyZ2V0KHMpIHBsYXF1ZSBsZXZlbHMgYnkgbGlwaWQtbG93ZXJpbmcgZHJ1Z3MgZ3JvdXAgKG5vLCB5ZXMpCi0gQm94IGFuZCBXaGlza2VyIHBsb3QgZm9yIHRhcmdldChzKSBwbGFxdWUgbGV2ZWxzIGJ5IExETC1sZXZlbHMgKG1tb2wvTCkgZ3JvdXAgKDwxMDAsIDEwMC0xMjksIDEzMC0xNTksIDE2MC0xODksIDE5MCspCgpgYGB7ciBMRExHcm91cHN9CmxpYnJhcnkoZHBseXIpCgpBRVJOQVNFLmNsaW4uaGRhYzkgPC0gQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBtdXRhdGUoTERMR3JvdXAgPSBmYWN0b3IoY2FzZV93aGVuKExETF9maW5hbENVIDwgMTAwIH4gIjwxMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExETF9maW5hbENVID49IDEwMCAgJiBMRExfZmluYWxDVSA8PSAxMjkgfiAiMTAwLTEyOSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERMX2ZpbmFsQ1UgPj0gMTMwICAmIExETF9maW5hbENVIDw9IDE1OSB+ICIxMzAtMTU5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRExfZmluYWxDVSA+PSAxNjAgICYgTERMX2ZpbmFsQ1UgPD0gMTg5IH4gIjE2MC0xODkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExETF9maW5hbENVID49IDE5MCB+ICIxOTArIikpKSAKCgp0YWJsZShBRVJOQVNFLmNsaW4uaGRhYzkkTERMR3JvdXAsIEFFUk5BU0UuY2xpbi5oZGFjOSRHZW5kZXIpCgpgYGAKCgpgYGB7ciBGaXggSHlwZXJjaG9sZXN0ZXJvbGVtaWEsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnJlcXVpcmUoc2psYWJlbGxlZCkKCkFFUk5BU0UuY2xpbi5oZGFjOSRyaXNrNjE0IDwtIHRvX2ZhY3RvcihBRVJOQVNFLmNsaW4uaGRhYzkkcmlzazYxNCkKCiMgRml4IHBsYXF1ZXBoZW5vdHlwZXMKYXR0YWNoKEFFUk5BU0UuY2xpbi5oZGFjOSkKQUVSTkFTRS5jbGluLmhkYWM5WywiSHlwZXJjaG9sZXN0ZXJvbGVtaWEiXSA8LSBOQQojIEFFUk5BU0UuY2xpbi5oZGFjOSRIeXBlcmNob2xlc3Rlcm9sZW1pYVtyaXNrNjE0ID09ICJtaXNzaW5nIHZhbHVlIl0gPC0gTkEKIyBBRVJOQVNFLmNsaW4uaGRhYzkkSHlwZXJjaG9sZXN0ZXJvbGVtaWFbcmlzazYxNCA9PSAtOTk5XSA8LSBOQQpBRVJOQVNFLmNsaW4uaGRhYzkkSHlwZXJjaG9sZXN0ZXJvbGVtaWFbcmlzazYxNCA9PSAibm8iXSA8LSAibm8iCkFFUk5BU0UuY2xpbi5oZGFjOSRIeXBlcmNob2xlc3Rlcm9sZW1pYVtyaXNrNjE0ID09ICJ5ZXMiXSA8LSAieWVzIgpkZXRhY2goQUVSTkFTRS5jbGluLmhkYWM5KQoKdGFibGUoQUVSTkFTRS5jbGluLmhkYWM5JHJpc2s2MTQsIEFFUk5BU0UuY2xpbi5oZGFjOSRIeXBlcmNob2xlc3Rlcm9sZW1pYSkKCiMgQUVEQi50ZW1wIDwtIHN1YnNldChBRURCLCAgc2VsZWN0ID0gYygiU1RVRFlfTlVNQkVSIiwgIlVQSUQiLCAiQWdlIiwgIkdlbmRlciIsICJIb3NwaXRhbCIsICJBcnRlcnlfc3VtbWFyeSIsICJyaXNrNjE0IiwgIkh5cGVyY2hvbGVzdGVyb2xlbWlhIikpCiMgcmVxdWlyZShsYWJlbGxlZCkKIyBBRURCLnRlbXAkR2VuZGVyIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkR2VuZGVyKQojIEFFREIudGVtcCRIb3NwaXRhbCA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEhvc3BpdGFsKQojIEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5KQojIAojIERUOjpkYXRhdGFibGUoQUVEQi50ZW1wWzE6MTAsXSwgY2FwdGlvbiA9ICJFeGNlcnB0IG9mIHRoZSB3aG9sZSBBRURCLiIsIHJvd25hbWVzID0gRkFMU0UpCiMgCiMgcm0oQUVEQi50ZW1wKQoKYGBgCgpOb3cgd2UgY2FuIGRyYXcgc29tZSBncmFwaHMgb2YgcGxhcXVlIHRhcmdldChzKSBsZXZlbHMgcGVyIHNleCBhbmQgaHlwZXJjaG9sZXN0ZXJvbGVtaWEvTERMLWxldmVscyBncm91cCwgYXMgd2VsbCBhcyBzdHJhdGlmaWVkIGJ5IGxpcGlkLWxvd2VyaW5nIGRydWdzIHVzZXJzIGFzIG1lZGlhbiDCsSBpbnRlcnF1YXJ0aWxlIHJhbmdlLgoKYGBge3IgcGVyIEh5cGVyY2hvbGVzdGVyb2xlbWlhIHBlciBTZXh9Cgpjb21wYXJlX21lYW5zKEhEQUM5IH4gTERMR3JvdXAsIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoTERMR3JvdXApKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShMRExHcm91cCkpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkxETEdyb3VwIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzkiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJMREwgKG1nL2RMKSBwZXIgZ2VuZGVyIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKSkiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJMRExHcm91cCIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAibnBnIiwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwgPSAicC5mb3JtYXQiLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIucGxhcXVlLkxETEdyb3Vwcy5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKY29tcGFyZV9tZWFucyhIREFDOSB+IExETEdyb3VwLCBncm91cC5ieSA9ICJHZW5kZXIiLCBkYXRhID0gQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKExETEdyb3VwKSksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoTERMR3JvdXApKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJMRExHcm91cCIpLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5IiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiTERMIChtZy9kTCkgcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikpIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhhZXMoZ3JvdXAgPSBHZW5kZXIpLCBsYWJlbCA9ICJwLmZvcm1hdCIsIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3NhdmUoZmlsZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLFRvZGF5LCIuQUVSTkFTRS5jbGluLmhkYWM5LiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5wbGFxdWUuTERMR3JvdXBzX2J5R2VuZGVyLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgoKCmNvbXBhcmVfbWVhbnMoSERBQzkgfiBIeXBlcmNob2xlc3Rlcm9sZW1pYSwgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShIeXBlcmNob2xlc3Rlcm9sZW1pYSkpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKEh5cGVyY2hvbGVzdGVyb2xlbWlhKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiSHlwZXJjaG9sZXN0ZXJvbGVtaWEiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkRpYWdub3NlZCBoeXBlcmNob2xlc3Rlcm9sZW1pYSIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikpIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiSHlwZXJjaG9sZXN0ZXJvbGVtaWEiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGxhYmVsID0gInAuZm9ybWF0IiwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLnBsYXF1ZS5IeXBlcmNob2xlc3Rlcm9sZW1pYS5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKY29tcGFyZV9tZWFucyhIREFDOSB+IEh5cGVyY2hvbGVzdGVyb2xlbWlhLCBncm91cC5ieSA9ICJHZW5kZXIiLCBkYXRhID0gQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKEh5cGVyY2hvbGVzdGVyb2xlbWlhKSksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoSHlwZXJjaG9sZXN0ZXJvbGVtaWEpKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJIeXBlcmNob2xlc3Rlcm9sZW1pYSIpLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5IiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiRGlhZ25vc2VkIGh5cGVyY2hvbGVzdGVyb2xlbWlhIHBlciBnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoYWVzKGdyb3VwID0gR2VuZGVyKSwgbGFiZWwgPSAicC5mb3JtYXQiLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIucGxhcXVlLkh5cGVyY2hvbGVzdGVyb2xlbWlhX2J5R2VuZGVyLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgoKY29tcGFyZV9tZWFucyhIREFDOSB+IE1lZC5TdGF0aW4uTExELCBkYXRhID0gQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKE1lZC5TdGF0aW4uTExEKSksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoTWVkLlN0YXRpbi5MTEQpKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJNZWQuU3RhdGluLkxMRCIpLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5IiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiTGlwaWQtbG93ZXJpbmcgZHJ1ZyB1c2UiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIk1lZC5TdGF0aW4uTExEIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJucGciLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhsYWJlbCA9ICJwLmZvcm1hdCIsIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3NhdmUoZmlsZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLFRvZGF5LCIuQUVSTkFTRS5jbGluLmhkYWM5LiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5wbGFxdWUuTWVkLlN0YXRpbi5MTEQucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmNvbXBhcmVfbWVhbnMoSERBQzkgfiBNZWQuU3RhdGluLkxMRCwgZ3JvdXAuYnkgPSAiR2VuZGVyIiwgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShNZWQuU3RhdGluLkxMRCkpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKE1lZC5TdGF0aW4uTExEKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiTWVkLlN0YXRpbi5MTEQiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkxpcGlkLWxvd2VyaW5nIGRydWcgdXNlIHBlciBnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoYWVzKGdyb3VwID0gR2VuZGVyKSwgbGFiZWwgPSAicC5mb3JtYXQiLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIucGxhcXVlLk1lZC5TdGF0aW4uTExEX2J5R2VuZGVyLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgoKCgpjb21wYXJlX21lYW5zKEhEQUM5IH4gTERMR3JvdXAsIGdyb3VwLmJ5ID0gIk1lZC5TdGF0aW4uTExEIiwgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShMRExHcm91cCkgJiAhaXMubmEoTWVkLlN0YXRpbi5MTEQpKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShMRExHcm91cCkgJiAhaXMubmEoTWVkLlN0YXRpbi5MTEQpKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJMRExHcm91cCIpLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5IiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiTERMIChtZy9kTCkgcGVyIExMRCB1c2UiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIk1lZC5TdGF0aW4uTExEIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiM0OUEwMUQiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhhZXMoZ3JvdXAgPSBNZWQuU3RhdGluLkxMRCksIGxhYmVsID0gInAuZm9ybWF0IiwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLnBsYXF1ZS5MRExHcm91cHNfYnlNZWQuU3RhdGluLkxMRC5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKY29tcGFyZV9tZWFucyhIREFDOSB+IEh5cGVyY2hvbGVzdGVyb2xlbWlhLCBncm91cC5ieSA9ICJNZWQuU3RhdGluLkxMRCIsIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoSHlwZXJjaG9sZXN0ZXJvbGVtaWEpICYgIWlzLm5hKE1lZC5TdGF0aW4uTExEKSksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoSHlwZXJjaG9sZXN0ZXJvbGVtaWEpICYgIWlzLm5hKE1lZC5TdGF0aW4uTExEKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiSHlwZXJjaG9sZXN0ZXJvbGVtaWEiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkRpYWdub3NlZCBoeXBlcmNob2xlc3Rlcm9sZW1pYSBwZXIgTExEIHVzZSIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikpIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiTWVkLlN0YXRpbi5MTEQiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiIzQ5QTAxRCIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IE1lZC5TdGF0aW4uTExEKSwgbGFiZWwgPSAicC5mb3JtYXQiLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIucGxhcXVlLkxETEdyb3Vwc19ieU1lZC5TdGF0aW4uTExELnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgoKYGBgCgoKYGBge3IgcGVyIEh5cGVyY2hvbGVzdGVyb2xlbWlhIHBlciBTZXggSERBQzlfbWF4MTAwfQoKY29tcGFyZV9tZWFucyhIREFDOV9tYXgxMDAgfiBMRExHcm91cCwgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShMRExHcm91cCkpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKExETEdyb3VwKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiTERMR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOV9tYXgxMDAiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJMREwgKG1nL2RMKSBwZXIgZ2VuZGVyIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKSkiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJMRExHcm91cCIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAibnBnIiwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwgPSAicC5mb3JtYXQiLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIubWF4MTAwLnBsYXF1ZS5MRExHcm91cHMucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmNvbXBhcmVfbWVhbnMoSERBQzlfbWF4MTAwIH4gTERMR3JvdXAsIGdyb3VwLmJ5ID0gIkdlbmRlciIsIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoTERMR3JvdXApKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShMRExHcm91cCkpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkxETEdyb3VwIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzlfbWF4MTAwIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiTERMIChtZy9kTCkgcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikpIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhhZXMoZ3JvdXAgPSBHZW5kZXIpLCBsYWJlbCA9ICJwLmZvcm1hdCIsIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3NhdmUoZmlsZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLFRvZGF5LCIuQUVSTkFTRS5jbGluLmhkYWM5LiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5tYXgxMDAucGxhcXVlLkxETEdyb3Vwc19ieUdlbmRlci5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKCgpjb21wYXJlX21lYW5zKEhEQUM5X21heDEwMCB+IEh5cGVyY2hvbGVzdGVyb2xlbWlhLCBkYXRhID0gQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKEh5cGVyY2hvbGVzdGVyb2xlbWlhKSksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoSHlwZXJjaG9sZXN0ZXJvbGVtaWEpKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJIeXBlcmNob2xlc3Rlcm9sZW1pYSIpLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5X21heDEwMCIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkRpYWdub3NlZCBoeXBlcmNob2xlc3Rlcm9sZW1pYSIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikpIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiSHlwZXJjaG9sZXN0ZXJvbGVtaWEiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGxhYmVsID0gInAuZm9ybWF0IiwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLm1heDEwMC5wbGFxdWUuSHlwZXJjaG9sZXN0ZXJvbGVtaWEucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmNvbXBhcmVfbWVhbnMoSERBQzlfbWF4MTAwIH4gSHlwZXJjaG9sZXN0ZXJvbGVtaWEsIGdyb3VwLmJ5ID0gIkdlbmRlciIsIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoSHlwZXJjaG9sZXN0ZXJvbGVtaWEpKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShIeXBlcmNob2xlc3Rlcm9sZW1pYSkpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkh5cGVyY2hvbGVzdGVyb2xlbWlhIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzlfbWF4MTAwIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiRGlhZ25vc2VkIGh5cGVyY2hvbGVzdGVyb2xlbWlhIHBlciBnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoYWVzKGdyb3VwID0gR2VuZGVyKSwgbGFiZWwgPSAicC5mb3JtYXQiLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIubWF4MTAwLnBsYXF1ZS5IeXBlcmNob2xlc3Rlcm9sZW1pYV9ieUdlbmRlci5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKCmNvbXBhcmVfbWVhbnMoSERBQzlfbWF4MTAwIH4gTWVkLlN0YXRpbi5MTEQsIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoTWVkLlN0YXRpbi5MTEQpKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShNZWQuU3RhdGluLkxMRCkpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIk1lZC5TdGF0aW4uTExEIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzlfbWF4MTAwIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiTGlwaWQtbG93ZXJpbmcgZHJ1ZyB1c2UiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIk1lZC5TdGF0aW4uTExEIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJucGciLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhsYWJlbCA9ICJwLmZvcm1hdCIsIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3NhdmUoZmlsZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLFRvZGF5LCIuQUVSTkFTRS5jbGluLmhkYWM5LiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5tYXgxMDAucGxhcXVlLk1lZC5TdGF0aW4uTExELnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgpjb21wYXJlX21lYW5zKEhEQUM5X21heDEwMCB+IE1lZC5TdGF0aW4uTExELCBncm91cC5ieSA9ICJHZW5kZXIiLCBkYXRhID0gQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKE1lZC5TdGF0aW4uTExEKSksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoTWVkLlN0YXRpbi5MTEQpKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJNZWQuU3RhdGluLkxMRCIpLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5X21heDEwMCIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkxpcGlkLWxvd2VyaW5nIGRydWcgdXNlIHBlciBnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoYWVzKGdyb3VwID0gR2VuZGVyKSwgbGFiZWwgPSAicC5mb3JtYXQiLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIubWF4MTAwLnBsYXF1ZS5NZWQuU3RhdGluLkxMRF9ieUdlbmRlci5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKCgoKY29tcGFyZV9tZWFucyhIREFDOV9tYXgxMDAgfiBMRExHcm91cCwgZ3JvdXAuYnkgPSAiTWVkLlN0YXRpbi5MTEQiLCBkYXRhID0gQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKExETEdyb3VwKSAmICFpcy5uYShNZWQuU3RhdGluLkxMRCkpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKExETEdyb3VwKSAmICFpcy5uYShNZWQuU3RhdGluLkxMRCkpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkxETEdyb3VwIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzlfbWF4MTAwIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiTERMIChtZy9kTCkgcGVyIExMRCB1c2UiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIk1lZC5TdGF0aW4uTExEIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiM0OUEwMUQiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhhZXMoZ3JvdXAgPSBNZWQuU3RhdGluLkxMRCksIGxhYmVsID0gInAuZm9ybWF0IiwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLm1heDEwMC5wbGFxdWUuTERMR3JvdXBzX2J5TWVkLlN0YXRpbi5MTEQucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmNvbXBhcmVfbWVhbnMoSERBQzlfbWF4MTAwIH4gSHlwZXJjaG9sZXN0ZXJvbGVtaWEsIGdyb3VwLmJ5ID0gIk1lZC5TdGF0aW4uTExEIiwgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShIeXBlcmNob2xlc3Rlcm9sZW1pYSkgJiAhaXMubmEoTWVkLlN0YXRpbi5MTEQpKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShIeXBlcmNob2xlc3Rlcm9sZW1pYSkgJiAhaXMubmEoTWVkLlN0YXRpbi5MTEQpKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJIeXBlcmNob2xlc3Rlcm9sZW1pYSIpLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5X21heDEwMCIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkRpYWdub3NlZCBoeXBlcmNob2xlc3Rlcm9sZW1pYSBwZXIgTExEIHVzZSIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikpIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiTWVkLlN0YXRpbi5MTEQiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiIzQ5QTAxRCIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IE1lZC5TdGF0aW4uTExEKSwgbGFiZWwgPSAicC5mb3JtYXQiLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIubWF4MTAwLnBsYXF1ZS5MRExHcm91cHNfYnlNZWQuU3RhdGluLkxMRC5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKCmBgYAoKIyMgS2lkbmV5IGZ1bmN0aW9uIChlR0ZSKQpXZSB3YW50IHRvIGNyZWF0ZSBmaWd1cmVzIG9mIHRhcmdldChzKSBsZXZlbHMgc3RyYXRpZmllZCBieSBraWRuZXkgZnVuY3Rpb24uIAoKLSBCb3ggYW5kIFdoaXNrZXIgcGxvdCBmb3IgdGFyZ2V0KHMpIHBsYXF1ZSBsZXZlbHMgYnkgY2hyb25pYyBraWRuZXkgZGlzZWFzZSAoQ0tEKSBncm91cCAoMSwgMiwgMywgNCwgNSkKLSBCb3ggYW5kIFdoaXNrZXIgcGxvdCBmb3IgdGFyZ2V0KHMpIHBsYXF1ZSBsZXZlbHMgYnkgZUdGUiAoTURSRC1iYXNlZCkgZ3JvdXAgKDkwKywgNjAtODksIDMwLTU5LCA8MzApCgpgYGB7ciBFR0ZSfQpsaWJyYXJ5KGRwbHlyKQoKQUVSTkFTRS5jbGluLmhkYWM5IDwtIEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgbXV0YXRlKGVHRlJHcm91cCA9IGZhY3RvcihjYXNlX3doZW4oR0ZSX01EUkQgPCAxNSB+ICI8MTUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZSX01EUkQgPj0gMTUgICYgR0ZSX01EUkQgPD0gMjkgfiAiMTUtMjkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZSX01EUkQgPj0gMzAgICYgR0ZSX01EUkQgPD0gNTkgfiAiMzAtNTkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZSX01EUkQgPj0gNjAgICYgR0ZSX01EUkQgPD0gODkgfiAiNjAtODkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZSX01EUkQgPj0gOTAgfiAiOTArIikpKQoKdGFibGUoQUVSTkFTRS5jbGluLmhkYWM5JGVHRlJHcm91cCwgQUVSTkFTRS5jbGluLmhkYWM5JEdlbmRlcikKCnRhYmxlKEFFUk5BU0UuY2xpbi5oZGFjOSRlR0ZSR3JvdXAsIEFFUk5BU0UuY2xpbi5oZGFjOSRLRE9RSSkKCmBgYAoKTm93IHdlIGNhbiBkcmF3IHNvbWUgZ3JhcGhzIG9mIHBsYXF1ZSB0YXJnZXQocykgbGV2ZWxzIHBlciBzZXggYW5kIGtpZG5leSBmdW5jdGlvbiBncm91cCBhcyBtZWRpYW4gwrEgaW50ZXJxdWFydGlsZSByYW5nZS4KCgpgYGB7ciBwZXIgRUdGUiBwZXIgU2V4fQoKIyBHbG9iYWwgdGVzdAoKY29tcGFyZV9tZWFucyhIREFDOSB+IGVHRlJHcm91cCwgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShlR0ZSR3JvdXApKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShlR0ZSR3JvdXApKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJlR0ZSR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gImVHRlIgKG1ML21pbiBwZXIgMS43MyBtMikiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiZUdGUkdyb3VwIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJucGciLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIucGxhcXVlLkVHRlIucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmNvbXBhcmVfbWVhbnMoSERBQzkgfiBlR0ZSR3JvdXAsIGdyb3VwLmJ5ID0gIkdlbmRlciIsICBkYXRhID0gQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKGVHRlJHcm91cCkpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKGVHRlJHcm91cCkpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoImVHRlJHcm91cCIpLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5IiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiZUdGUiAobUwvbWluIHBlciAxLjczIG0yKSBwZXIgZ2VuZGVyIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoYWVzKGdyb3VwID0gR2VuZGVyKSwgbGFiZWwgPSAicC5mb3JtYXQiLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIucGxhcXVlLkVHRlJfYnlHZW5kZXIucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmNvbXBhcmVfbWVhbnMoSERBQzkgfiBLRE9RSSwgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShLRE9RSSkpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKcDEgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKEtET1FJKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiS0RPUUkiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIktpZG5leSBmdW5jdGlvbiAoS0RPUUkpIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIktET1FJIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJucGciLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhhZXMoZ3JvdXAgPSBLRE9RSSksIGxhYmVsID0gInAuZm9ybWF0IiwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncGFyKHAxICsgcm90YXRlX3hfdGV4dCg0NSksIGxlZ2VuZCA9ICJyaWdodCIpIApybShwMSkKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIucGxhcXVlLktET1FJLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgpjb21wYXJlX21lYW5zKEhEQUM5IH4gS0RPUUksIGdyb3VwLmJ5ID0gIkdlbmRlciIsICAgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShLRE9RSSkpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKcDEgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKEtET1FJKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiS0RPUUkiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIktpZG5leSBmdW5jdGlvbiAoS0RPUUkpIHBlciBnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhhZXMoZ3JvdXAgPSBHZW5kZXIpLCBsYWJlbCA9ICJwLmZvcm1hdCIsIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3BhcihwMSArIHJvdGF0ZV94X3RleHQoNDUpLCBsZWdlbmQgPSAicmlnaHQiKSAKcm0ocDEpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLnBsYXF1ZS5LRE9RSV9ieUdlbmRlci5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKY29tcGFyZV9tZWFucyhIREFDOSB+IGVHRlJHcm91cCwgIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoZUdGUkdyb3VwKSAmICFpcy5uYShLRE9RSSkpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKcDEgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKGVHRlJHcm91cCkgJiAhaXMubmEoS0RPUUkpKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJlR0ZSR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gImVHRlIgKG1ML21pbiBwZXIgMS43MyBtMikgYnkgS0RPUUkgZ3JvdXAiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiS0RPUUkiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3BhcihwMSwgbGVnZW5kID0gInJpZ2h0IikKcm0ocDEpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLnBsYXF1ZS5FR0ZSX0tET1FJLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgpgYGAKCmBgYHtyIHBlciBFR0ZSIHBlciBTZXggSERBQzlfbWF4MTAwfQoKIyBHbG9iYWwgdGVzdAoKY29tcGFyZV9tZWFucyhIREFDOV9tYXgxMDAgfiBlR0ZSR3JvdXAsIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoZUdGUkdyb3VwKSksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoZUdGUkdyb3VwKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiZUdGUkdyb3VwIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzlfbWF4MTAwIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiZUdGUiAobUwvbWluIHBlciAxLjczIG0yKSIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJlR0ZSR3JvdXAiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3NhdmUoZmlsZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLFRvZGF5LCIuQUVSTkFTRS5jbGluLmhkYWM5LiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5tYXgxMDAucGxhcXVlLkVHRlIucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmNvbXBhcmVfbWVhbnMoSERBQzlfbWF4MTAwIH4gZUdGUkdyb3VwLCBncm91cC5ieSA9ICJHZW5kZXIiLCAgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShlR0ZSR3JvdXApKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShlR0ZSR3JvdXApKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJlR0ZSR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOV9tYXgxMDAiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJlR0ZSIChtTC9taW4gcGVyIDEuNzMgbTIpIHBlciBnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhhZXMoZ3JvdXAgPSBHZW5kZXIpLCBsYWJlbCA9ICJwLmZvcm1hdCIsIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3NhdmUoZmlsZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLFRvZGF5LCIuQUVSTkFTRS5jbGluLmhkYWM5LiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5tYXgxMDAucGxhcXVlLkVHRlJfYnlHZW5kZXIucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmNvbXBhcmVfbWVhbnMoSERBQzlfbWF4MTAwIH4gS0RPUUksIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoS0RPUUkpKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCnAxIDwtIGdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShLRE9RSSkpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIktET1FJIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzlfbWF4MTAwIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiS2lkbmV5IGZ1bmN0aW9uIChLRE9RSSkiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiS0RPUUkiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IEtET1FJKSwgbGFiZWwgPSAicC5mb3JtYXQiLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwYXIocDEgKyByb3RhdGVfeF90ZXh0KDQ1KSwgbGVnZW5kID0gInJpZ2h0IikgCnJtKHAxKQpnZ3NhdmUoZmlsZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLFRvZGF5LCIuQUVSTkFTRS5jbGluLmhkYWM5LiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5tYXgxMDAucGxhcXVlLktET1FJLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgpjb21wYXJlX21lYW5zKEhEQUM5X21heDEwMCB+IEtET1FJLCBncm91cC5ieSA9ICJHZW5kZXIiLCAgIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoS0RPUUkpKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCnAxIDwtIGdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShLRE9RSSkpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIktET1FJIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzlfbWF4MTAwIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiS2lkbmV5IGZ1bmN0aW9uIChLRE9RSSkgcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IEdlbmRlciksIGxhYmVsID0gInAuZm9ybWF0IiwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncGFyKHAxICsgcm90YXRlX3hfdGV4dCg0NSksIGxlZ2VuZCA9ICJyaWdodCIpIApybShwMSkKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIubWF4MTAwLnBsYXF1ZS5LRE9RSV9ieUdlbmRlci5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKY29tcGFyZV9tZWFucyhIREFDOV9tYXgxMDAgfiBlR0ZSR3JvdXAsICBkYXRhID0gQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKGVHRlJHcm91cCkgJiAhaXMubmEoS0RPUUkpKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCnAxIDwtIGdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShlR0ZSR3JvdXApICYgIWlzLm5hKEtET1FJKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiZUdGUkdyb3VwIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzlfbWF4MTAwIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiZUdGUiAobUwvbWluIHBlciAxLjczIG0yKSBieSBLRE9RSSBncm91cCIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJLRE9RSSIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAibnBnIiwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncGFyKHAxLCBsZWdlbmQgPSAicmlnaHQiKQpybShwMSkKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIubWF4MTAwLnBsYXF1ZS5FR0ZSX0tET1FJLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgpgYGAKCiMjIEJNSQpXZSB3YW50IHRvIGNyZWF0ZSBmaWd1cmVzIG9mIHRhcmdldChzKSBsZXZlbHMgc3RyYXRpZmllZCBieSBCTUkuIAoKLSBCb3ggYW5kIFdoaXNrZXIgcGxvdCBmb3IgdGFyZ2V0KHMpIHBsYXF1ZSBsZXZlbHMgYnkgQk1JIFdITyBncm91cCAodW5kZXJ3ZWlnaHQsIG5vcm1hbCwgb3ZlcndlaWdodCwgb2Jlc2UpCi0gQm94IGFuZCBXaGlza2VyIHBsb3QgZm9yIHRhcmdldChzKSBwbGFxdWUgbGV2ZWxzIGJ5IEJNSSBncm91cCAoPDE4LjUsIDE4LjUtMjQuOSwgMjUsIDI5LjksIDMwLTI0LjksIDM1KykKCmBgYHtyIEJNSX0KbGlicmFyeShkcGx5cikKCkFFUk5BU0UuY2xpbi5oZGFjOSA8LSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIG11dGF0ZShCTUlHcm91cCA9IGZhY3RvcihjYXNlX3doZW4oQk1JIDwgMTguNSB+ICI8MTguNSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk1JID49IDE4LjUgICYgQk1JIDwgMjUgfiAiMTguNS0yNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk1JID49IDI1ICAmIEJNSSA8IDMwIH4gIjI1LTI5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTUkgPj0gMzAgICYgQk1JIDwgMzUgfiAiMzAtMzUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJNSSA+PSAzNSB+ICIzNSsiKSkpIAoKIyByZXF1aXJlKGxhYmVsbGVkKQojIEFFUk5BU0UuY2xpbi5oZGFjOSRCTUlfVVMgPC0gYXNfZmFjdG9yKEFFUk5BU0UuY2xpbi5oZGFjOSRCTUlfVVMpCiMgQUVSTkFTRS5jbGluLmhkYWM5JEJNSV9XSE8gPC0gYXNfZmFjdG9yKEFFUk5BU0UuY2xpbi5oZGFjOSRCTUlfV0hPKQojIHRhYmxlKEFFUk5BU0UuY2xpbi5oZGFjOSRCTUlfV0hPLCBBRVJOQVNFLmNsaW4uaGRhYzkkQk1JX1VTKQoKdGFibGUoQUVSTkFTRS5jbGluLmhkYWM5JEJNSUdyb3VwLCBBRVJOQVNFLmNsaW4uaGRhYzkkR2VuZGVyKQp0YWJsZShBRVJOQVNFLmNsaW4uaGRhYzkkQk1JR3JvdXAsIEFFUk5BU0UuY2xpbi5oZGFjOSRCTUlfV0hPKQoKYGBgCgpOb3cgd2UgY2FuIGRyYXcgc29tZSBncmFwaHMgb2YgcGxhcXVlIE1DUDEgbGV2ZWxzIHBlciBzZXggYW5kIGFnZSBncm91cCBhcyBtZWRpYW4gwrEgaW50ZXJxdWFydGlsZSByYW5nZS4KCgpgYGB7ciBwZXIgQk1JIHBlciBTZXh9CgojIEdsb2JhbCB0ZXN0CmNvbXBhcmVfbWVhbnMoSERBQzkgfiBCTUlHcm91cCwgIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoQk1JR3JvdXApKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShCTUlHcm91cCkpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkJNSUdyb3VwIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzkiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJCTUkgZ3JvdXBzIChrZy9tMikiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pIiwKICAgICAgICAgICAgICAgICAgIyBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAjIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiQk1JR3JvdXAiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGxhYmVsID0gInAuZm9ybWF0IiwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLnBsYXF1ZS5CTUkucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmNvbXBhcmVfbWVhbnMoSERBQzkgfiBCTUlHcm91cCwgZ3JvdXAuYnkgPSAiR2VuZGVyIiwgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShCTUlHcm91cCkpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKEJNSUdyb3VwKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiQk1JR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkJNSSBncm91cHMgKGtnL20yKSBwZXIgZ2VuZGVyIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoYWVzKGdyb3VwID0gR2VuZGVyKSwgbGFiZWwgPSAicC5mb3JtYXQiLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIucGxhcXVlLkJNSV9ieUdlbmRlci5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKY29tcGFyZV9tZWFucyhIREFDOSB+IEJNSUdyb3VwLCAgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShCTUlHcm91cCkgJiAhaXMubmEoQk1JX1dITykpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKcDEgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKEJNSUdyb3VwKSAmICFpcy5uYShCTUlfV0hPKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiQk1JR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkJNSSBncm91cHMgKGtnL20yKSBwZXIgV0hPIGNhdGVnb3JpZXMiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiQk1JX1dITyIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAibnBnIiwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncGFyKHAxLCBsZWdlbmQgPSAicmlnaHQiKQpybShwMSkKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIucGxhcXVlLkJNSV9ieVdITy5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKYGBgCgoKYGBge3IgcGVyIEJNSSBwZXIgU2V4IEhEQUM5X21heDEwMH0KCiMgR2xvYmFsIHRlc3QKY29tcGFyZV9tZWFucyhIREFDOV9tYXgxMDAgfiBCTUlHcm91cCwgIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoQk1JR3JvdXApKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShCTUlHcm91cCkpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkJNSUdyb3VwIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzlfbWF4MTAwIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiQk1JIGdyb3VwcyAoa2cvbTIpIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKSIsCiAgICAgICAgICAgICAgICAgICMgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgIyBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkJNSUdyb3VwIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJucGciLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhsYWJlbCA9ICJwLmZvcm1hdCIsIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3NhdmUoZmlsZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLFRvZGF5LCIuQUVSTkFTRS5jbGluLmhkYWM5LiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5tYXgxMDAucGxhcXVlLkJNSS5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKY29tcGFyZV9tZWFucyhIREFDOV9tYXgxMDAgfiBCTUlHcm91cCwgZ3JvdXAuYnkgPSAiR2VuZGVyIiwgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShCTUlHcm91cCkpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKEJNSUdyb3VwKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiQk1JR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOV9tYXgxMDAiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJCTUkgZ3JvdXBzIChrZy9tMikgcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IEdlbmRlciksIGxhYmVsID0gInAuZm9ybWF0IiwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLm1heDEwMC5wbGFxdWUuQk1JX2J5R2VuZGVyLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgpjb21wYXJlX21lYW5zKEhEQUM5X21heDEwMCB+IEJNSUdyb3VwLCAgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShCTUlHcm91cCkgJiAhaXMubmEoQk1JX1dITykpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKcDEgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKEJNSUdyb3VwKSAmICFpcy5uYShCTUlfV0hPKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiQk1JR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOV9tYXgxMDAiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJCTUkgZ3JvdXBzIChrZy9tMikgcGVyIFdITyBjYXRlZ29yaWVzIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkJNSV9XSE8iLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3BhcihwMSwgbGVnZW5kID0gInJpZ2h0IikKcm0ocDEpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLm1heDEwMC5wbGFxdWUuQk1JX2J5V0hPLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgpgYGAKCgoKIyMgRGlhYmV0ZXMKV2Ugd2FudCB0byBjcmVhdGUgZmlndXJlcyBvZiB0YXJnZXQocykgbGV2ZWxzIHN0cmF0aWZpZWQgYnkgdHlwZSAyIGRpYWJldGVzLiAKCi0gQm94IGFuZCBXaGlza2VyIHBsb3QgZm9yIHRhcmdldChzKSBwbGFxdWUgbGV2ZWxzIGJ5IHR5cGUgMiBkaWFiZXRlcyBncm91cCAobm8sIHllcykKCk5vdyB3ZSBjYW4gZHJhdyBzb21lIGdyYXBocyBvZiBwbGFxdWUgdGFyZ2V0KHMpIGxldmVscyBwZXIgc2V4IGFuZCBhZ2UgZ3JvdXAgYXMgbWVkaWFuIMKxIGludGVycXVhcnRpbGUgcmFuZ2UuCgoKYGBge3IgcGVyIERpYWJldGVzIHBlciBTZXh9CgojIEdsb2JhbCB0ZXN0CmNvbXBhcmVfbWVhbnMoSERBQzkgfiBEaWFiZXRlc1N0YXR1cywgIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoRGlhYmV0ZXNTdGF0dXMpKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShEaWFiZXRlc1N0YXR1cykpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkRpYWJldGVzU3RhdHVzIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzkiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJEaWFiZXRlcyBzdGF0dXMiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pIiwKICAgICAgICAgICAgICAgICAgIyBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAjIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiRGlhYmV0ZXNTdGF0dXMiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGFkZCA9IGMoIm1lZGlhbl9pcXIiLCAiaml0dGVyIikpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwgPSAicC5mb3JtYXQiLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIucGxhcXVlLkRpYWJldGVzLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgpjb21wYXJlX21lYW5zKEhEQUM5IH4gRGlhYmV0ZXNTdGF0dXMsIGdyb3VwLmJ5ID0gIkdlbmRlciIsIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoRGlhYmV0ZXNTdGF0dXMpKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShEaWFiZXRlc1N0YXR1cykpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkRpYWJldGVzU3RhdHVzIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzkiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJEaWFiZXRlcyBzdGF0dXMgcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9IGMoIm1lZGlhbl9pcXIiLCAiaml0dGVyIikpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoYWVzKGdyb3VwID0gR2VuZGVyKSwgbGFiZWwgPSAicC5mb3JtYXQiLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIucGxhcXVlLkRpYWJldGVzX2J5R2VuZGVyLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgoKYGBgCgoKYGBge3IgcGVyIERpYWJldGVzIHBlciBTZXggSERBQzlfbWF4MTAwfQoKIyBHbG9iYWwgdGVzdApjb21wYXJlX21lYW5zKEhEQUM5X21heDEwMCB+IERpYWJldGVzU3RhdHVzLCAgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShEaWFiZXRlc1N0YXR1cykpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKERpYWJldGVzU3RhdHVzKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiRGlhYmV0ZXNTdGF0dXMiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOV9tYXgxMDAiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJEaWFiZXRlcyBzdGF0dXMiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pIiwKICAgICAgICAgICAgICAgICAgIyBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAjIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiRGlhYmV0ZXNTdGF0dXMiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGFkZCA9IGMoIm1lZGlhbl9pcXIiLCAiaml0dGVyIikpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwgPSAicC5mb3JtYXQiLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIubWF4MTAwLnBsYXF1ZS5EaWFiZXRlcy5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKY29tcGFyZV9tZWFucyhIREFDOV9tYXgxMDAgfiBEaWFiZXRlc1N0YXR1cywgZ3JvdXAuYnkgPSAiR2VuZGVyIiwgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShEaWFiZXRlc1N0YXR1cykpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKERpYWJldGVzU3RhdHVzKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiRGlhYmV0ZXNTdGF0dXMiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOV9tYXgxMDAiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJEaWFiZXRlcyBzdGF0dXMgcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9IGMoIm1lZGlhbl9pcXIiLCAiaml0dGVyIikpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoYWVzKGdyb3VwID0gR2VuZGVyKSwgbGFiZWwgPSAicC5mb3JtYXQiLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIubWF4MTAwLnBsYXF1ZS5EaWFiZXRlc19ieUdlbmRlci5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKCmBgYAoKCiMjIFNtb2tpbmcKV2Ugd2FudCB0byBjcmVhdGUgZmlndXJlcyBvZiB0YXJnZXQocykgbGV2ZWxzIHN0cmF0aWZpZWQgYnkgc21va2luZy4gCgotIEJveCBhbmQgV2hpc2tlciBwbG90IGZvciB0YXJnZXQocykgcGxhcXVlIGxldmVscyBieSBzbW9raW5nIGdyb3VwIChuZXZlciwgZXgsIGN1cnJlbnQpCgpOb3cgd2UgY2FuIGRyYXcgc29tZSBncmFwaHMgb2YgcGxhcXVlIHRhcmdldChzKSBsZXZlbHMgcGVyIHNleCBhbmQgYWdlIGdyb3VwIGFzIG1lZGlhbiDCsSBpbnRlcnF1YXJ0aWxlIHJhbmdlLgoKCmBgYHtyIHBlciBTbW9raW5nIHBlciBTZXh9CgojIEdsb2JhbCB0ZXN0CmNvbXBhcmVfbWVhbnMoSERBQzkgfiBTbW9rZXJTdGF0dXMsICBkYXRhID0gQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKFNtb2tlclN0YXR1cykpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKFNtb2tlclN0YXR1cykpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIlNtb2tlclN0YXR1cyIpLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5IiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiU21va2VyIHN0YXR1cyIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICAjIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICMgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJTbW9rZXJTdGF0dXMiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGFkZCA9IGMoIm1lZGlhbl9pcXIiLCAiaml0dGVyIikpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwgPSAicC5mb3JtYXQiLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIucGxhcXVlLlNtb2tpbmcucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmNvbXBhcmVfbWVhbnMoSERBQzkgfiBTbW9rZXJTdGF0dXMsIGdyb3VwLmJ5ID0iR2VuZGVyIiwgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShTbW9rZXJTdGF0dXMpKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShTbW9rZXJTdGF0dXMpKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJTbW9rZXJTdGF0dXMiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIlNtb2tlciBzdGF0dXMgcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9IGMoIm1lZGlhbl9pcXIiLCAiaml0dGVyIikpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoYWVzKGdyb3VwID0gR2VuZGVyKSwgbGFiZWwgPSAicC5mb3JtYXQiLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIucGxhcXVlLlNtb2tpbmdfYnlHZW5kZXIucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmBgYAoKYGBge3IgcGVyIFNtb2tpbmcgcGVyIFNleCBIREFDOV9tYXgxMDB9CgojIEdsb2JhbCB0ZXN0CmNvbXBhcmVfbWVhbnMoSERBQzlfbWF4MTAwIH4gU21va2VyU3RhdHVzLCAgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShTbW9rZXJTdGF0dXMpKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShTbW9rZXJTdGF0dXMpKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJTbW9rZXJTdGF0dXMiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOV9tYXgxMDAiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJTbW9rZXIgc3RhdHVzIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKSIsCiAgICAgICAgICAgICAgICAgICMgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgIyBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIlNtb2tlclN0YXR1cyIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAibnBnIiwKICAgICAgICAgICAgICAgICAgYWRkID0gYygibWVkaWFuX2lxciIsICJqaXR0ZXIiKSkgKwogIHN0YXRfY29tcGFyZV9tZWFucyhsYWJlbCA9ICJwLmZvcm1hdCIsIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3NhdmUoZmlsZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLFRvZGF5LCIuQUVSTkFTRS5jbGluLmhkYWM5LiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5tYXgxMDAucGxhcXVlLlNtb2tpbmcucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmNvbXBhcmVfbWVhbnMoSERBQzlfbWF4MTAwIH4gU21va2VyU3RhdHVzLCBncm91cC5ieSA9IkdlbmRlciIsIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoU21va2VyU3RhdHVzKSksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoU21va2VyU3RhdHVzKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiU21va2VyU3RhdHVzIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzlfbWF4MTAwIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiU21va2VyIHN0YXR1cyBwZXIgZ2VuZGVyIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gYygibWVkaWFuX2lxciIsICJqaXR0ZXIiKSkgKwogIHN0YXRfY29tcGFyZV9tZWFucyhhZXMoZ3JvdXAgPSBHZW5kZXIpLCBsYWJlbCA9ICJwLmZvcm1hdCIsIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3NhdmUoZmlsZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLFRvZGF5LCIuQUVSTkFTRS5jbGluLmhkYWM5LiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5tYXgxMDAucGxhcXVlLlNtb2tpbmdfYnlHZW5kZXIucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmBgYAoKIyMgU3Rlbm9zaXMKV2Ugd2FudCB0byBjcmVhdGUgZmlndXJlcyBvZiB0YXJnZXQocykgbGV2ZWxzIHN0cmF0aWZpZWQgYnkgc3Rlbm9zaXMgZ3JhZGUuIAoKLSBCb3ggYW5kIFdoaXNrZXIgcGxvdCBmb3IgdGFyZ2V0KHMpIHBsYXF1ZSBsZXZlbHMgYnkgc3Rlbm9zaXMgZ3JhZGUgZ3JvdXAgKDw3MCwgNzAtODksIDkwKykKCmBgYHtyIFN0ZW5vc2lzfQpsaWJyYXJ5KGRwbHlyKQoKQUVSTkFTRS5jbGluLmhkYWM5IDwtIEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgbXV0YXRlKFN0ZW5vdGljR3JvdXAgPSBmYWN0b3IoY2FzZV93aGVuKHN0ZW5vc2UgPT0gIjAtNDklIiB+ICI8NzAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZW5vc2UgPT0gIjAtNDklIiB+ICI8NzAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZW5vc2UgPT0gIjUwLTcwJSIgfiAiPDcwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVub3NlID09ICI3MC05MCUiIH4gIjcwLTg5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVub3NlID09ICI1MC05OSUiIH4gIjkwKyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rlbm9zZSA9PSAiNzAtOTklIiB+ICI5MCsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZW5vc2UgPT0gIjEwMCUgKE9jY2x1c2lvbikiIH4gIjkwKyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rlbm9zZSA9PSAiOTAtOTklIiB+ICI5MCsiKSkpCgp0YWJsZShBRVJOQVNFLmNsaW4uaGRhYzkkU3Rlbm90aWNHcm91cCwgQUVSTkFTRS5jbGluLmhkYWM5JEdlbmRlcikKdGFibGUoQUVSTkFTRS5jbGluLmhkYWM5JHN0ZW5vc2UsIEFFUk5BU0UuY2xpbi5oZGFjOSRTdGVub3RpY0dyb3VwKQoKYGBgCgpOb3cgd2UgY2FuIGRyYXcgc29tZSBncmFwaHMgb2YgcGxhcXVlIHRhcmdldChzKSBsZXZlbHMgcGVyIHNleCBhbmQgYWdlIGdyb3VwIGFzIG1lZGlhbiDCsSBpbnRlcnF1YXJ0aWxlIHJhbmdlLgoKYGBge3IgcGVyIFN0ZW5vc2lzIHBlciBTZXh9CgojIEdsb2JhbCB0ZXN0CmNvbXBhcmVfbWVhbnMoSERBQzkgfiBTdGVub3RpY0dyb3VwLCAgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShTdGVub3RpY0dyb3VwKSksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoU3Rlbm90aWNHcm91cCkpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIlN0ZW5vdGljR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIlN0ZW5vdGljIGdyYWRlIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKSIsCiAgICAgICAgICAgICAgICAgICMgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgIyBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIlN0ZW5vdGljR3JvdXAiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGxhYmVsID0gInAuZm9ybWF0IiwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLnBsYXF1ZS5TdGVub3Npcy5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKY29tcGFyZV9tZWFucyhIREFDOSB+IFN0ZW5vdGljR3JvdXAsIGdyb3VwLmJ5ID0gIkdlbmRlciIsIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoU3Rlbm90aWNHcm91cCkpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKFN0ZW5vdGljR3JvdXApKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJTdGVub3RpY0dyb3VwIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzkiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJTdGVub3RpYyBncmFkZSBwZXIgZ2VuZGVyIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoYWVzKGdyb3VwID0gR2VuZGVyKSwgbGFiZWwgPSAicC5mb3JtYXQiLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIucGxhcXVlLlN0ZW5vc2lzX2J5R2VuZGVyLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgpgYGAKCmBgYHtyIHBlciBTdGVub3NpcyBwZXIgU2V4IEhEQUM5X21heDEwMH0KCiMgR2xvYmFsIHRlc3QKY29tcGFyZV9tZWFucyhIREFDOV9tYXgxMDAgfiBTdGVub3RpY0dyb3VwLCAgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShTdGVub3RpY0dyb3VwKSksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoU3Rlbm90aWNHcm91cCkpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIlN0ZW5vdGljR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOV9tYXgxMDAiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJTdGVub3RpYyBncmFkZSIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICAjIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICMgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJTdGVub3RpY0dyb3VwIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJucGciLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhsYWJlbCA9ICJwLmZvcm1hdCIsIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3NhdmUoZmlsZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLFRvZGF5LCIuQUVSTkFTRS5jbGluLmhkYWM5LiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5tYXgxMDAucGxhcXVlLlN0ZW5vc2lzLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgpjb21wYXJlX21lYW5zKEhEQUM5X21heDEwMCB+IFN0ZW5vdGljR3JvdXAsIGdyb3VwLmJ5ID0gIkdlbmRlciIsIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoU3Rlbm90aWNHcm91cCkpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKFN0ZW5vdGljR3JvdXApKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJTdGVub3RpY0dyb3VwIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzlfbWF4MTAwIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiU3Rlbm90aWMgZ3JhZGUgcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IEdlbmRlciksIGxhYmVsID0gInAuZm9ybWF0IiwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLm1heDEwMC5wbGFxdWUuU3Rlbm9zaXNfYnlHZW5kZXIucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmBgYAoKCgojIyBTeW1wdG9tcwpXZSB3YW50IHRvIGNyZWF0ZSBwZXItc3ltcHRvbSBmaWd1cmVzLiAKCmBgYHtyIFN5bXB0b21Hcm91cHN9CmxpYnJhcnkoZHBseXIpCgp0YWJsZShBRVJOQVNFLmNsaW4uaGRhYzkkQWdlR3JvdXAsIEFFUk5BU0UuY2xpbi5oZGFjOSRBc3ltcHRTeW1wdDJHKQp0YWJsZShBRVJOQVNFLmNsaW4uaGRhYzkkR2VuZGVyLCBBRVJOQVNFLmNsaW4uaGRhYzkkQXN5bXB0U3ltcHQyRykKdGFibGUoQUVSTkFTRS5jbGluLmhkYWM5JEFzeW1wdFN5bXB0MkcpCgpgYGAKCk5vdyB3ZSBjYW4gZHJhdyBzb21lIGdyYXBocyBvZiBwbGFxdWUgdGFyZ2V0KHMpIGxldmVscyBwZXIgc3ltcHRvbSBncm91cCBhcyBtZWRpYW4gwrEgaW50ZXJxdWFydGlsZSByYW5nZS4KCmBgYHtyIHBlciBTeW1wdG9tR3JvdXBzfQoKIyA/Z2dwdWJyOjpnZ2JveHBsb3QoKQpteV9jb21wYXJpc29ucyA8LSBsaXN0KGMoIkFzeW1wdG9tYXRpYyIsICJTeW1wdG9tYXRpYyIpKQoKY29tcGFyZV9tZWFucyhIREFDOSB+IEFzeW1wdFN5bXB0MkcsIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpwMSA8LSBnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzksIAogICAgICAgICAgICAgICAgICB4ID0gIkFzeW1wdFN5bXB0MkciLCB5ID0gIkhEQUM5IiwKICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikgbGV2ZWxzIHBlciBzeW1wdG9tIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiU3ltcHRvbXMiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiQXN5bXB0U3ltcHQyRyIsIAogICAgICAgICAgICAgICAgICAjIHBhbGV0dGUgPSBjKHVpdGhvZl9jb2xvclsxNl0sIHVpdGhvZl9jb2xvclsyM10pLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJkb3RwbG90IiwgIyBBZGQgZG90cGxvdAogICAgICAgICAgICAgICAgICBhZGQucGFyYW1zID0gbGlzdChiaW53aWR0aCA9IDAuMSwgZG90c2l6ZSA9IDAuMykKICAgICAgICAgICkgKwogIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IG15X2NvbXBhcmlzb25zLCBtZXRob2QgPSAid2lsY294LnRlc3QiKQpnZ3BhcihwMSwgbGVnZW5kID0gYygicmlnaHQiKSwgbGVnZW5kLnRpdGxlID0gIlN5bXB0b21zIikKCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLnBsYXF1ZS5Bc3ltcHRTeW1wdDJHLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgpybShwMSkKYGBgCgpgYGB7ciBwZXIgU3ltcHRvbUdyb3VwcyBieSBHZW5kZXJ9CmNvbXBhcmVfbWVhbnMoSERBQzkgfiBBc3ltcHRTeW1wdDJHLCBncm91cC5ieSA9ICJHZW5kZXIiLCBkYXRhID0gQUVSTkFTRS5jbGluLmhkYWM5LCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKcDEgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5LCAKICAgICAgICAgICAgICAgICAgeCA9ICJBc3ltcHRTeW1wdDJHIiwgeSA9ICJIREFDOSIsCiAgICAgICAgICAgICAgICAgIHRpdGxlID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pIGxldmVscyBwZXIgc3ltcHRvbSBieSBnZW5kZXIiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJTeW1wdG9tcyIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJkb3RwbG90IiwgIyBBZGQgZG90cGxvdAogICAgICAgICAgICAgICAgICBhZGQucGFyYW1zID0gbGlzdChiaW53aWR0aCA9IDAuMSwgZG90c2l6ZSA9IDAuMykKICAgICAgICAgICkgKwogIHN0YXRfY29tcGFyZV9tZWFucyhhZXMoZ3JvdXAgPSBHZW5kZXIpLCBsYWJlbCA9ICJwLmZvcm1hdCIsICBtZXRob2QgPSAid2lsY294LnRlc3QiKQpnZ3BhcihwMSwgbGVnZW5kID0gYygicmlnaHQiKSwgbGVnZW5kLnRpdGxlID0gIlN5bXB0b21zIikKCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLnBsYXF1ZS5Bc3ltcHRTeW1wdDJHLmJ5R2VuZGVyLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgpybShwMSkKCmBgYAoKIyMjIEFsdGVybmF0aXZlIGdyYXBoCmBgYHtyfQojID9nZ3B1YnI6OmdnYm94cGxvdCgpCiMgY29tcGFyZV9tZWFucyhMUkNIMSB+IGVHRlJHcm91cCwgZGF0YSA9IEFFUk5BU0UuY2xpbiAlPiUgZmlsdGVyKCFpcy5uYShlR0ZSR3JvdXApKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCiMgZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluICU+JSBmaWx0ZXIoIWlzLm5hKGVHRlJHcm91cCkpCgpjYXQoIkdldCBzdW1tYXJ5IHN0YXRpc3RpY3MgZm9yIHRhcmdldDpcbiIpCnN1bW1hcnkoQUVSTkFTRS5jbGluLmhkYWM5JEhEQUM5KQoKY2F0KCJcbkNvdW50IG51bWJlciBvZiB2YWx1ZXMgPiAxMDAgZm9yIHRhcmdldDpcbiIpCnN1bShBRVJOQVNFLmNsaW4uaGRhYzkkSERBQzkgPiAxMDApCgpjYXQoIlxuU2V0dGluZyB2YWx1ZXMgPiAxMDAgZm9yIHRhcmdldCB0byAxMDAuXG4iKQp0ZW1wIDwtIEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgCiAgZmlsdGVyKCFpcy5uYShBc3ltcHRTeW1wdDJHKSkKCnRlbXAkSERBQzlbdGVtcCRIREFDOSA+IDEwMF0gPC0gMTAwCgpjYXQoIkdldCBzdW1tYXJ5IHN0YXRpc3RpY3MgZm9yIHRhcmdldCBhZnRlciBmaXhpbmcgdmFsdWVzOlxuIikKc3VtbWFyeSh0ZW1wJEhEQUM5KQoKYGBgCgoKYGBge3J9Cm15X2NvbXBhcmlzb25zIDwtIGxpc3QoYygiQXN5bXB0b21hdGljIiwgIlN5bXB0b21hdGljIikpCgpjb21wYXJlX21lYW5zKEhEQUM5IH4gQXN5bXB0U3ltcHQyRywgZGF0YSA9IHRlbXAsIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQoKcDEgPC0gZ2dwdWJyOjpnZ2JveHBsb3QodGVtcCwgCiAgICAgICAgICAgICAgICAgIHggPSAiQXN5bXB0U3ltcHQyRyIsIHkgPSAiSERBQzkiLAogICAgICAgICAgICAgICAgICB0aXRsZSA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKSBsZXZlbHMgcGVyIHN5bXB0b20iLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJTeW1wdG9tcyIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJBc3ltcHRTeW1wdDJHIiwgCiAgICAgICAgICAgICAgICAgICMgcGFsZXR0ZSA9IGModWl0aG9mX2NvbG9yWzE2XSwgdWl0aG9mX2NvbG9yWzIzXSksCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAibnBnIiwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIsICMgQWRkIGRvdHBsb3QKICAgICAgICAgICAgICAgICAgYWRkLnBhcmFtcyA9IGxpc3QoYmlud2lkdGggPSAwLjEsIGRvdHNpemUgPSAwLjMpCiAgICAgICAgICApICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBteV9jb21wYXJpc29ucywgbWV0aG9kID0gIndpbGNveC50ZXN0IikKZ2dwYXIocDEsIGxlZ2VuZCA9IGMoInJpZ2h0IiksIGxlZ2VuZC50aXRsZSA9ICJTeW1wdG9tcyIpCgpnZ3NhdmUoZmlsZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLFRvZGF5LCIuQUVSTkFTRS5jbGluLiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5IREFDOS5wbGFxdWUuQXN5bXB0U3ltcHQyRy5ub05BX2xpbWl0Q291bnQxMDAucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi4iLFRSQUlUX09GX0lOVEVSRVNULCIuSERBQzkucGxhcXVlLkFzeW1wdFN5bXB0Mkcubm9OQV9saW1pdENvdW50MTAwLnBzIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi4iLFRSQUlUX09GX0lOVEVSRVNULCIuSERBQzkucGxhcXVlLkFzeW1wdFN5bXB0Mkcubm9OQV9saW1pdENvdW50MTAwLnBuZyIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgpybShwMSwgdGVtcCkKYGBgCgoKCiMjIEZvcmVzdCBwbG90cwoKV2Ugd291bGQgYWxzbyBsaWtlIHRvIHZpc3VhbGl6ZSB0aGUgbXVsdGl2YXJpYWJsZSBhbmFseXNlcyByZXN1bHRzLgpgYGB7ciBsb2FkIG1vZGVsIGRhdGF9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShvcGVueGxzeCkKIyBtb2RlbDFfdGFyZ2V0IDwtIHJlYWQueGxzeChwYXN0ZTAoT1VUX2xvYywgIi8iLCBUb2RheSwgIi5BRVJOQVNFLmNsaW4uaGRhYzkuQmluLlVuaS4iLFRSQUlUX09GX0lOVEVSRVNULCIuUkFOSy5TeW1wdG9tcy5NT0RFTDEueGxzeCIpKQojIG1vZGVsMl90YXJnZXQgPC0gcmVhZC54bHN4KHBhc3RlMChPVVRfbG9jLCAiLyIsIFRvZGF5LCAiLkFFUk5BU0UuY2xpbi5oZGFjOS5CaW4uTXVsdGkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLlJBTksuU3ltcHRvbXMuTU9ERUwyLnhsc3giKSkKCm1vZGVsMV90YXJnZXQgPC0gcmVhZC54bHN4KHBhc3RlMChPVVRfbG9jLCAiLzIwMjMwNTMxLkFFUk5BU0UuY2xpbi5oZGFjOS5CaW4uVW5pLiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5SQU5LLlN5bXB0b21zLk1PREVMMS54bHN4IikpCm1vZGVsMl90YXJnZXQgPC0gcmVhZC54bHN4KHBhc3RlMChPVVRfbG9jLCAiLzIwMjMwNTMxLkFFUk5BU0UuY2xpbi5oZGFjOS5CaW4uTXVsdGkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLlJBTksuU3ltcHRvbXMuTU9ERUwyLnhsc3giKSkKCm1vZGVsMV90YXJnZXQkbW9kZWwgPC0gInVuaXZhcmlhdGUiCm1vZGVsMl90YXJnZXQkbW9kZWwgPC0gIm11bHRpdmFyaWF0ZSIKCm1vZGVsc190YXJnZXQgPC0gcmJpbmQobW9kZWwxX3RhcmdldCwgbW9kZWwyX3RhcmdldCkKbW9kZWxzX3RhcmdldAoKYGBgCgpGb3Jlc3QgcGxvdHMuCgpgYGB7ciBmb3Jlc3RwbG90IHBsYXF1ZSwgZXhwZXJpbWVudCAyfQpkYXQgPC0gZGF0YS5mcmFtZShncm91cCA9IGZhY3RvcihjKCJBZ2UsIHNleC1hZGp1c3RlZCIsICJBZ2UsIHNleCwgYW5kIGFkanVzdGVkIGZvciByaXNrIGZhY3RvcnMiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9YygiQWdlLCBzZXgsIGFuZCBhZGp1c3RlZCBmb3IgcmlzayBmYWN0b3JzIiwgIkFnZSwgc2V4LWFkanVzdGVkIikpLAogICAgICAgICAgICAgICAgICBjZW4gPSBjKG1vZGVsc190YXJnZXQkT1JbbW9kZWxzX3RhcmdldCRQcmVkaWN0b3I9PSJIREFDOSJdKSwKICAgICAgICAgICAgICAgICAgbG93ID0gYyhtb2RlbHNfdGFyZ2V0JGxvdzk1Q0lbbW9kZWxzX3RhcmdldCRQcmVkaWN0b3I9PSJIREFDOSJdKSwKICAgICAgICAgICAgICAgICAgaGlnaCA9IGMobW9kZWxzX3RhcmdldCR1cDk1Q0lbbW9kZWxzX3RhcmdldCRQcmVkaWN0b3I9PSJIREFDOSJdKSkKCmZwIDwtIGdncGxvdChkYXRhID0gZGF0LCBhZXMoeCA9IGdyb3VwLCB5ID0gY2VuLCB5bWluID0gbG93LCB5bWF4ID0gaGlnaCkpICsKICBnZW9tX3BvaW50cmFuZ2UobGluZXR5cGUgPSAyLCBzaXplID0gMSwgY29sb3VyID0gYygiIzEyOTBEOSIsICIjNDlBMDFEIikpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMSwgbHR5ID0gMikgKyAgIyBhZGQgYSBkb3R0ZWQgbGluZSBhdCB4PTEgYWZ0ZXIgZmxpcAogIGNvb3JkX2ZsaXAoeWxpbSA9IGMoMC44LCAxLjcpKSArICAjIGZsaXAgY29vcmRpbmF0ZXMgKHB1dHMgbGFiZWxzIG9uIHkgYXhpcykKICB4bGFiKCJNb2RlbCIpICsgeWxhYigiT1IgKDk1JSBDSSkgZm9yIHN5bXB0b21hdGljIHBsYXF1ZXMiKSArCiAgZ2d0aXRsZSgiTm9ybWFsaXplZCBIREFDOSBleHByZXNzaW9uIikgKwogIHRoZW1lX21pbmltYWwoKSAgIyB1c2UgYSB3aGl0ZSBiYWNrZ3JvdW5kCnByaW50KGZwKQoKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCIucGxhcXVlLmZvcmVzdC5wZGYiKSwgcGxvdCA9IGZwKQoKcm0oZnApCmBgYAoKCiMjIEhEQUM5IHZzLiBjeXRva2luZXMgcGxhcXVlIGxldmVscyBjb3JyZWxhdGlvbnMKCldlIHdpbGwgcGxvdCB0aGUgY29ycmVsYXRpb25zIG9mIG90aGVyIGN5dG9raW5lIHBsYXF1ZSBsZXZlbHMgdG8gdGhlIE1DUDEgcGxhcXVlIGxldmVscy4gVGhlc2UgaW5jbHVkZToKCi0gSUwyCi0gSUw0Ci0gSUw1Ci0gSUw2Ci0gSUw4Ci0gSUw5Ci0gSUwxMAotIElMMTIKLSBJTDEzCi0gSUwyMQotIElORkcKLSBUTkZBCi0gTUlGCi0gTUNQMQotIE1JUDFhCi0gUkFOVEVTCi0gTUlHCi0gSVAxMAotIEVvdGF4aW4xCi0gVEFSQwotIFBBUkMKLSBNREMKLSBPUEcKLSBzSUNBTTEKLSBWRUdGQQotIFRHRkIKCkluIGFkZGl0aW9uIHdlIHdpbGwgbG9vayBhdCB0aHJlZSBtZXRhbGxvcHJvdGVpbmFzZXMgd2hpY2ggd2VyZSBtZWFzdXJlZCB1c2luZyBhbiBhY3Rpdml0eSBhc3NheS4gCgotIE1NUDIKLSBNTVA4Ci0gTU1QOQoKVGhlIHByb3RlaW5zIHdlcmUgbWVhc3VyZWQgdXNpbmcgRkFDUyBhbmQgTFVNSU5FWC4gR2l2ZW4gdGhlIGRpZmZlcmVudCBwbGF0Zm9ybXMgdXNlZCAoRkFDUyB2cy4gTFVNSU5FWCksIHdlIHdpbGwgaW52ZXJzZSByYW5rLW5vcm1hbGl6ZSB0aGVzZSB2YXJpYWJsZXMgYXMgd2VsbCB0byBzY2FsZSB0aGVtIHRvIHRoZSBzYW1lIHNjYWxlIGFzIHRoZSB0YXJnZXQocylgIHBsYXF1ZSBsZXZlbHMuCgoKV2Ugd2lsbCBzZXQgdGhlIG1lYXN1cmVtZW50cyB0aGF0IHlpZWxkZWQgJzAnIHRvIE5BLCBhcyBpdCBpcyB1bmxpa2VseSB0aGF0IGFueSBwcm90ZWluIGV2ZXIgaGFzIGV4YWN0bHkgMCBjb3BpZXMuIFRoZSAnMCcgeWllbGRlZCBkdXJpbmcgdGhlIGV4cGVyaW1lbnQgYXJlIGR1ZSB0byB0aGUgbGltaXRzIG9mIHRoZSBkZXRlY3Rpb24uCgojIyMgUHJlcGFyZSBkYXRhCgpgYGB7cn0KIyBmaXggbmFtZXMKbmFtZXMoQUVEQi5DRUEpW25hbWVzKEFFREIuQ0VBKSA9PSAiVkVGR0EiXSA8LSAiVkVHRkEiCgojIGZpeCBuYW1lcwpuYW1lcyhBRVJOQVNFLmNsaW4uaGRhYzkpW25hbWVzKEFFUk5BU0UuY2xpbi5oZGFjOSkgPT0gIklMNiJdIDwtICJJTDZybmEiCgpjeXRva2luZXMgPC0gYygiSUwyIiwgIklMNCIsICJJTDUiLCAiSUw2IiwgIklMOCIsICJJTDkiLCAiSUwxMCIsICJJTDEyIiwgIklMMTMiLCAiSUwyMSIsIAogICAgICAgICAgICAgICAiSU5GRyIsICJUTkZBIiwgIk1JRiIsICJNQ1AxIiwgIk1JUDFhIiwgIlJBTlRFUyIsICJNSUciLCAiSVAxMCIsICJFb3RheGluMSIsIAogICAgICAgICAgICAgICAiVEFSQyIsICJQQVJDIiwgIk1EQyIsICJPUEciLCAic0lDQU0xIiwgIlZFR0ZBIiwgIlRHRkIiKQptZXRhbGxvcHJvdGVpbmFzZXMgPC0gYygiTU1QMiIsICJNTVA4IiwgIk1NUDkiKQoKCkFFUk5BU0UuY2xpbi5oZGFjOSA8LSBtZXJnZShBRVJOQVNFLmNsaW4uaGRhYzksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2V0KEFFREIuQ0VBLCBzZWxlY3QgPSBjKCJTVFVEWV9OVU1CRVIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeXRva2luZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWxsb3Byb3RlaW5hc2VzKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkueCA9ICJTVFVEWV9OVU1CRVIiLCBieS55ID0gIlNUVURZX05VTUJFUiIsIHNvcnQgPSBUUlVFLCBhbGwueCA9IFRSVUUpCgpgYGAKCgpgYGB7ciBIREFDOSB2cyBDeXRva2luZXMgSU5SVCwgcGFnZWQucHJpbnQ9VFJVRX0KCnByb3RlaW5zX29mX2ludGVyZXN0IDwtIGMoY3l0b2tpbmVzLCBtZXRhbGxvcHJvdGVpbmFzZXMpCgpwcm90ZWluc19vZl9pbnRlcmVzdF9yYW5rID0gdW5saXN0KGxhcHBseShwcm90ZWluc19vZl9pbnRlcmVzdCwgcGFzdGUwLCAiX3JhbmsiKSkKCiMgbWFrZSB2YXJpYWJsZXMgbnVtZXJpY3MoKQpBRVJOQVNFLmNsaW4uaGRhYzkgPC0gQUVSTkFTRS5jbGluLmhkYWM5ICU+JQogIG11dGF0ZV9lYWNoKGZ1bnMoYXMubnVtZXJpYyksIHByb3RlaW5zX29mX2ludGVyZXN0KQogIApmb3IoUFJPVEVJTiBpbiAxOmxlbmd0aChwcm90ZWluc19vZl9pbnRlcmVzdCkpewoKICAjIFVDT1JCSU9HU0FxYyRaIDwtIE5VTEwKICB2YXIudGVtcC5yYW5rID0gcHJvdGVpbnNfb2ZfaW50ZXJlc3RfcmFua1tQUk9URUlOXQogIHZhci50ZW1wID0gcHJvdGVpbnNfb2ZfaW50ZXJlc3RbUFJPVEVJTl0KICAKICBjYXQocGFzdGUwKCJcblNlbGVjdGluZyAiLCB2YXIudGVtcCwgIiBhbmQgc3RhbmRhcmRpc2luZzogIiwgdmFyLnRlbXAucmFuaywiLlxuIikpCiAgY2F0KHBhc3RlMCgiKiBjaGFuZ2luZyAiLCB2YXIudGVtcCwgIiB0byBudW1lcmljLlxuIikpCgogICMgQUVSTkFTRS5jbGluLmhkYWM5IDwtICBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIG11dGF0ZShBRVJOQVNFLmNsaW4uaGRhYzlbLHZhci50ZW1wXSA9PSByZXBsYWNlKEFFUk5BU0UuY2xpbi5oZGFjOVssdmFyLnRlbXBdLCBBRVJOQVNFLmNsaW4uaGRhYzlbLHZhci50ZW1wXT09MCwgTkEpKQoKICBBRVJOQVNFLmNsaW4uaGRhYzlbLHZhci50ZW1wXVtBRVJOQVNFLmNsaW4uaGRhYzlbLHZhci50ZW1wXT09MC4wMDAwMDBdPU5BCgogIGNhdChwYXN0ZTAoIiogc3RhbmRhcmRpc2luZyAiLCB2YXIudGVtcCwgCiAgICAgICAgICAgICAiIChtZWFuOiAiLHJvdW5kKG1lYW4oIWlzLm5hKEFFUk5BU0UuY2xpbi5oZGFjOVssdmFyLnRlbXBdKSksIGRpZ2l0cyA9IDYpLAogICAgICAgICAgICAgIiwgbiA9ICIsc3VtKCFpcy5uYShBRVJOQVNFLmNsaW4uaGRhYzlbLHZhci50ZW1wXSkpLCIpLlxuIikpCiAgCiAgQUVSTkFTRS5jbGluLmhkYWM5IDwtIEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUKICAgICAgbXV0YXRlX2F0KHZhcnModmFyLnRlbXApLCAKICAgICAgICAjIGxpc3QoWiA9IH4gKEFFUk5BU0UuY2xpbi5oZGFjOVssdmFyLnRlbXBdIC0gbWVhbihBRVJOQVNFLmNsaW4uaGRhYzlbLHZhci50ZW1wXSwgbmEucm0gPSBUUlVFKSkvc2QoQUVSTkFTRS5jbGluLmhkYWM5Wyx2YXIudGVtcF0sIG5hLnJtID0gVFJVRSkpCiAgICAgICAgbGlzdChSQU5LID0gfiBxbm9ybSgocmFuayhBRVJOQVNFLmNsaW4uaGRhYzlbLHZhci50ZW1wXSwgbmEubGFzdCA9ICJrZWVwIikgLSAwLjUpIC8gc3VtKCFpcy5uYShBRVJOQVNFLmNsaW4uaGRhYzlbLHZhci50ZW1wXSkpKSkKICAgICAgKQogICMgc3RyKFVDT1JCSU9HU0FxYyRaKQogIGNhdChwYXN0ZTAoIiogcmVuYW1pbmcgUkFOSyB0byAiLCB2YXIudGVtcC5yYW5rLCIuXG4iKSkKICBBRVJOQVNFLmNsaW4uaGRhYzlbLHZhci50ZW1wLnJhbmtdIDwtIE5VTEwKICBuYW1lcyhBRVJOQVNFLmNsaW4uaGRhYzkpW25hbWVzKEFFUk5BU0UuY2xpbi5oZGFjOSkgPT0gIlJBTksiXSA8LSB2YXIudGVtcC5yYW5rCn0KCiMgcm0odmFyLnRlbXAsIHZhci50ZW1wLnJhbmspCgpgYGAKCiMjIyBWaXN1YWxpemUgdHJhbnNmb3JtYXRpb25zCgpXZSB3aWxsIGp1c3QgdmlzdWFsaXplIHRoZXNlIHRyYW5zZm9ybWF0aW9ucy4KCmBgYHtyIEhEQUM5IHZzIEN5dG9raW5lcyBIaXN0b2dyYW1zfQpwcm90ZWluc19vZl9pbnRlcmVzdF9yYW5rX3RhcmdldCA8LSBjKCJIREFDOSIsIHByb3RlaW5zX29mX2ludGVyZXN0X3JhbmspCgpwcm90ZWluc19vZl9pbnRlcmVzdF90YXJnZXQgPC0gYygiSERBQzkiLCBwcm90ZWluc19vZl9pbnRlcmVzdCkKCmZvcihQUk9URUlOIGluIHByb3RlaW5zX29mX2ludGVyZXN0X3RhcmdldCl7CiAgY2F0KHBhc3RlMCgiUGxvdHRpbmcgcHJvdGVpbiAiLCBQUk9URUlOLCAiLlxuIikpCiAgCiAgcDEgPC0gZ2dwdWJyOjpnZ2hpc3RvZ3JhbShBRVJOQVNFLmNsaW4uaGRhYzksIFBST1RFSU4sCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiIzEyOTBEOSIsICIjREIwMDNGIiksCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lYW4iLAogICAgICAgICAgICAgICAgICAgICMgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjIGFkZC5wYXJhbXMgPSAgbGlzdChjb2xvciA9ICJibGFjayIsIGxpbmV0eXBlID0gMiksCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBwYXN0ZTAoUFJPVEVJTiwgIiBwbGFxdWUgbGV2ZWxzIiksCiAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICIiLAogICAgICAgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpCiAgcHJpbnQocDEpCiAgCn0KCgpmb3IoUFJPVEVJTiBpbiBwcm90ZWluc19vZl9pbnRlcmVzdF9yYW5rX3RhcmdldCl7CiAgY2F0KHBhc3RlMCgiUGxvdHRpbmcgcHJvdGVpbiAiLCBQUk9URUlOLCAiLlxuIikpCiAgCiAgcDEgPC0gZ2dwdWJyOjpnZ2hpc3RvZ3JhbShBRVJOQVNFLmNsaW4uaGRhYzksIFBST1RFSU4sCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiIzEyOTBEOSIsICIjREIwMDNGIiksCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lYW4iLAogICAgICAgICAgICAgICAgICAgICMgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjIGFkZC5wYXJhbXMgPSAgbGlzdChjb2xvciA9ICJibGFjayIsIGxpbmV0eXBlID0gMiksCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBwYXN0ZTAoUFJPVEVJTiwgIiBwbGFxdWUgbGV2ZWxzIiksCiAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJpbnZlcnNlLW5vcm1hbCB0cmFuc2Zvcm1hdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKICBwcmludChwMSkKICAKfQogIApgYGAKCiMjIyBDb3JyZWxhdGlvbnMKCkhlcmUgd2UgY2FsY3VsYXRlIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRhcmdldChzKSBhbmQgMjggb3RoZXIgY3l0b2tpbmVzLiBXZSB1c2UgU3BlYXJtYW4ncyB0ZXN0LCB0aHVzLCBjb3JyZWxhdGlvbnMgYSBnaXZlbiBpbiBfcmhvXy4gUGxlYXNlIG5vdGUgdGhlIGluZGljYXRpb25zIG9mIG1lYXN1cmVtZW50IG1ldGhvZHM6CgotIF9MXzogTFVNSU5FWAotIF9FXzogRUxJU0EKLSBfYV86IGFjdGl2aXR5IGFzc2F5CgpgYGB7ciBNQ1AxIHZzIEN5dG9raW5lcyBjb3JyZWxhdGlvbnN9CiMgSW5zdGFsbGF0aW9uIG9mIGdnY29ycnBsb3QoKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCFyZXF1aXJlKGRldnRvb2xzKSkgCiAgaW5zdGFsbC5wYWNrYWdlcygiZGV2dG9vbHMiKQpkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoImthc3NhbWJhcmEvZ2djb3JycGxvdCIpCgpsaWJyYXJ5KGdnY29ycnBsb3QpCgojIENyZWF0aW5nIG1hdHJpeCAtIGludmVyc2UtcmFuayB0cmFuc2Zvcm1hdGlvbgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRlbXAgPC0gc3Vic2V0KEFFUk5BU0UuY2xpbi5oZGFjOSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ID0gYyhwcm90ZWluc19vZl9pbnRlcmVzdF9yYW5rX3RhcmdldCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoKIyBzdHIoQUVEQi5DRUEudGVtcCkKbWF0cml4LlJBTksgPC0gYXMubWF0cml4KHRlbXApCnJtKHRlbXApCgpjb3JyX2Jpb21hcmtlcnMucmFuayA8LSByb3VuZChjb3IobWF0cml4LlJBTkssIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZSA9ICJwYWlyd2lzZS5jb21wbGV0ZS5vYnMiLCAjdGhlIGNvcnJlbGF0aW9uIG9yIGNvdmFyaWFuY2UgYmV0d2VlbiBlYWNoIHBhaXIgb2YgdmFyaWFibGVzIGlzIGNvbXB1dGVkIHVzaW5nIGFsbCBjb21wbGV0ZSBwYWlycyBvZiBvYnNlcnZhdGlvbnMgb24gdGhvc2UgdmFyaWFibGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gInNwZWFybWFuIiksIDMpCiMgY29ycl9iaW9tYXJrZXJzLnJhbmsKCnJlbmFtZV9wcm90ZWluc19vZl9pbnRlcmVzdF90YXJnZXQgPC0gYygiSERBQzkgKFJOQSkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklMMiIsICJJTDQiLCAiSUw1IiwgIklMNiIsICJJTDgiLCAiSUw5IiwgIklMMTAiLCAiSUwxMiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSUwxMyAoTCkiLCAiSUwyMSAoTCkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklORkciLCAiVE5GQSIsICJNSUYgKEwpIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNQ1AxIChMKSIsICJNSVAxYSAoTCkiLCAiUkFOVEVTIChMKSIsICJNSUcgKEwpIiwgIklQMTAgKEwpIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFb3RheGluMSAoTCkiLCAiVEFSQyAoTCkiLCAiUEFSQyAoTCkiLCAiTURDIChMKSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT1BHIChMKSIsICJzSUNBTTEgKEwpIiwgIlZFR0ZBIChFKSIsICJUR0ZCIChFKSIsICJNTVAyIChhKSIsICJNTVA4IChhKSIsICJNTVA5IChhKSIpCmNvbG5hbWVzKGNvcnJfYmlvbWFya2Vycy5yYW5rKSA8LSBjKHJlbmFtZV9wcm90ZWluc19vZl9pbnRlcmVzdF90YXJnZXQpCnJvd25hbWVzKGNvcnJfYmlvbWFya2Vycy5yYW5rKSA8LSBjKHJlbmFtZV9wcm90ZWluc19vZl9pbnRlcmVzdF90YXJnZXQpCgpjb3JyX2Jpb21hcmtlcnNfcC5yYW5rIDwtIGdnY29ycnBsb3Q6OmNvcl9wbWF0KG1hdHJpeC5SQU5LLCB1c2UgPSAicGFpcndpc2UuY29tcGxldGUub2JzIiwgbWV0aG9kID0gInNwZWFybWFuIikKCiMgKysrKysrKysrKysrKysrKysrKysrKysrKysrKwojIGZsYXR0ZW5Db3JyTWF0cml4CiMgKysrKysrKysrKysrKysrKysrKysrKysrKysrKwojIGNvcm1hdCA6IG1hdHJpeCBvZiB0aGUgY29ycmVsYXRpb24gY29lZmZpY2llbnRzCiMgcG1hdCA6IG1hdHJpeCBvZiB0aGUgY29ycmVsYXRpb24gcC12YWx1ZXMKZmxhdHRlbkNvcnJNYXRyaXggPC0gZnVuY3Rpb24oY29ybWF0LCBwbWF0KSB7CiAgdXQgPC0gdXBwZXIudHJpKGNvcm1hdCkKICBkYXRhLmZyYW1lKAogICAgcm93ID0gcm93bmFtZXMoY29ybWF0KVtyb3coY29ybWF0KVt1dF1dLAogICAgY29sdW1uID0gcm93bmFtZXMoY29ybWF0KVtjb2woY29ybWF0KVt1dF1dLAogICAgY29yICA9KGNvcm1hdClbdXRdLAogICAgcCA9IHBtYXRbdXRdCiAgICApCn0KCmNvcnJfYmlvbWFya2Vycy5yYW5rLmRmIDwtIGZsYXR0ZW5Db3JyTWF0cml4KGNvcnJfYmlvbWFya2Vycy5yYW5rLCBjb3JyX2Jpb21hcmtlcnNfcC5yYW5rKQoKCm5hbWVzKGNvcnJfYmlvbWFya2Vycy5yYW5rLmRmKVtuYW1lcyhjb3JyX2Jpb21hcmtlcnMucmFuay5kZikgPT0gInJvdyJdIDwtICJDeXRva2luZV9YIgpuYW1lcyhjb3JyX2Jpb21hcmtlcnMucmFuay5kZilbbmFtZXMoY29ycl9iaW9tYXJrZXJzLnJhbmsuZGYpID09ICJjb2x1bW4iXSA8LSAiQ3l0b2tpbmVZIgpuYW1lcyhjb3JyX2Jpb21hcmtlcnMucmFuay5kZilbbmFtZXMoY29ycl9iaW9tYXJrZXJzLnJhbmsuZGYpID09ICJjb3IiXSA8LSAiU3BlYXJtYW5SaG8iCgpEVDo6ZGF0YXRhYmxlKGNvcnJfYmlvbWFya2Vycy5yYW5rLmRmKQoKZndyaXRlKGNvcnJfYmlvbWFya2Vycy5yYW5rLmRmLCBmaWxlID0gcGFzdGUwKE9VVF9sb2MsICIvIixUb2RheSwiLmNvcnJlbGF0aW9uX2N5dG9raW5lcy50eHQiKSkKCmBgYAoKYGBge3IgTUNQMSB2cyBDeXRva2luZXMgaGVhdG1hcH0KIyBBZGQgY29ycmVsYXRpb24gY29lZmZpY2llbnRzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBhcmd1bWVudCBsYWIgPSBUUlVFCnAxIDwtIGdnY29ycnBsb3QoY29ycl9iaW9tYXJrZXJzLnJhbmssIAogICAgICAgICAgIG1ldGhvZCA9ICJzcXVhcmUiLCAKICAgICAgICAgICB0eXBlID0gImxvd2VyIiwKICAgICAgICAgICB0aXRsZSA9ICJDcm9zcyBiaW9tYXJrZXIgY29ycmVsYXRpb25zIiwgCiAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBUUlVFLCBsZWdlbmQudGl0bGUgPSBicXVvdGUoIlNwZWFybWFuJ3Mifml0YWxpYyhyaG8pKSwKICAgICAgICAgICBnZ3RoZW1lID0gZ2dwbG90Mjo6dGhlbWVfbWluaW1hbCwgb3V0bGluZS5jb2xvciA9ICIjRkZGRkZGIiwKICAgICAgICAgICBzaG93LmRpYWcgPSBUUlVFLAogICAgICAgICAgIGhjLm9yZGVyID0gRkFMU0UsIAogICAgICAgICAgIGxhYiA9IEZBTFNFLAogICAgICAgICAgIGRpZ2l0cyA9IDMsCiAgICAgICAgICAgdGwuY2V4ID0gMTYsCiAgICAgICAgICAgIyB4bGFiID0gYygiTUNQMSIpLAogICAgICAgICAgICMgcC5tYXQgPSBjb3JyX2Jpb21hcmtlcnNfcC5yYW5rLCBzaWcubGV2ZWwgPSAwLjA1LAogICAgICAgICAgIGNvbG9ycyA9IGMoIiMxMjkwRDkiLCAiI0ZGRkZGRiIsICIjRTU1NzM4IikpCnAxCmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5jb3JyZWxhdGlvbl9jeXRva2luZXMucG5nIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLmNvcnJlbGF0aW9uX2N5dG9raW5lcy5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKcm0ocDEpCgpgYGAKCldoaWxlIHZpc3VhbGx5IGF0dHJhY3RpdmUgd2UgYXJlIG5vdCBuZWNlc3NhcmlseSBpbnRlcmVzdGVkIGluIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBhbGwgdGhlIGN5dG9raW5lcywgcmF0aGVyIG9mIHRhcmdldChzKWAgd2l0aCBvdGhlciBjeXRva2luZXMgb25seS4KCmBgYHtyIE1DUDEgdnMgQ3l0b2tpbmVzIGJhcnBsb3R9CnRlbXAgPC0gc3Vic2V0KGNvcnJfYmlvbWFya2Vycy5yYW5rLmRmLCBDeXRva2luZV9YID09ICJIREFDOSAoUk5BKSIgKQp0ZW1wJHBfbG9nMTAgPC0gLWxvZzEwKHRlbXAkcCkKcF90aHJlc2hvbGQgPC0gLWxvZzEwKDAuMDUvbnJvdyh0ZW1wKSkKcF90aHJlc2hvbGQKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShnZ3Bsb3QyKQoKcDEgPC0gZ2dwdWJyOjpnZ2JhcnBsb3QodGVtcCwgeCA9ICJDeXRva2luZVkiLCB5ID0gIlNwZWFybWFuUmhvIiwKICAgICAgICAgIGZpbGwgPSAiQ3l0b2tpbmVZIiwgICAgICAgICAgICAgICAjIGNoYW5nZSBmaWxsIGNvbG9yIGJ5IGN5bAogICAgICAgICAgIyBjb2xvciA9ICJ3aGl0ZSIsICAgICAgICAgICAgIyBTZXQgYmFyIGJvcmRlciBjb2xvcnMgdG8gd2hpdGUKICAgICAgICAgIHBhbGV0dGUgPSB1aXRob2ZfY29sb3IsICAgICAgICAgICAgIyBqY28gam91cm5hbCBjb2xvciBwYWxldHQuIHNlZSA/Z2dwYXIKICAgICAgICAgIHhsYWIgPSAiQ3l0b2tpbmUiLAogICAgICAgICAgeWxhYiA9ICJTcGVhcm1hbidzIHJobyIsICMgZXhwcmVzc2lvbigiU3BlYXJtYW4ncyJ+aXRhbGljKHJobykpLAogICAgICAgICAgc29ydC52YWwgPSAiZGVzYyIsICAgICAgICAgICMgU29ydCB0aGUgdmFsdWUgaW4gZHNjZW5kaW5nIG9yZGVyCiAgICAgICAgICBzb3J0LmJ5Lmdyb3VwcyA9IEZBTFNFLCAgICAgIyBEb24ndCBzb3J0IGluc2lkZSBlYWNoIGdyb3VwCiAgICAgICAgICB4LnRleHQuYW5nbGUgPSA0NSwgIyBSb3RhdGUgdmVydGljYWxseSB4IGF4aXMgdGV4dHMKICAgICAgICAgIGNleCA9IDEuMjUKICAgICAgICAgICkKZ2dwYXIocDEsIGxlZ2VuZCA9ICJib3R0b20iLCAKICAgICAgbGVnZW5kLnRpdGxlID0gIiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCkpIAoKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCJfdnNfQ3l0b2tpbmVzLnBuZyIpLCBwbG90ID0gbGFzdF9wbG90KCkpCmdnc2F2ZShmaWxlID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuIixUUkFJVF9PRl9JTlRFUkVTVCwiX3ZzX0N5dG9raW5lcy5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQpybShwMSkKCgpgYGAKCkFub3RoZXIgdmVyc2lvbiAtIHByb2JhYmx5IG5vdCBnb29kLiAKYGBge3IgTUNQMSB2cyBDeXRva2luZXMgZG90Y2hhcnR9CnRlbXAgPC0gc3Vic2V0KGNvcnJfYmlvbWFya2Vycy5yYW5rLmRmLCBDeXRva2luZV9YID09ICJIREFDOSAoUk5BKSIgKQp0ZW1wJHBfbG9nMTAgPC0gLWxvZzEwKHRlbXAkcCkKcF90aHJlc2hvbGQgPC0gLWxvZzEwKDAuMDUvbnJvdyh0ZW1wKSkKcF90aHJlc2hvbGQKcDEgPC0gZ2dkb3RjaGFydCh0ZW1wLCB4ID0gIkN5dG9raW5lWSIsIHkgPSAicF9sb2cxMCIsCiAgICAgICAgICAgY29sb3IgPSAiQ3l0b2tpbmVZIiwgI2ZpbGwgPSAiQ3l0b2tpbmVZIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENvbG9yIGJ5IGdyb3VwcwogICAgICAgICAgIHBhbGV0dGUgPSB1aXRob2ZfY29sb3IsICMgQ3VzdG9tIGNvbG9yIHBhbGV0dGUKICAgICAgICAgICB4bGFiID0gIkN5dG9raW5lIiwKICAgICAgICAgICB5bGFiID0gImxvZzEwKFApIiwgIyBleHByZXNzaW9uKGxvZ1sxMF1+Iigifml0YWxpYyhwKX4iKS12YWx1ZSIpLAogICAgICAgICAgICMgeWxpbSA9IGMoMCwgOSksCiAgICAgICAgICAgc29ydGluZyA9ICJkZXNjZW5kaW5nIiwgICAgICAgICAgICAgICAgICAgICAgICMgU29ydCB2YWx1ZSBpbiBkZXNjZW5kaW5nIG9yZGVyCiAgICAgICAgICAgYWRkID0gInNlZ21lbnRzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQWRkIHNlZ21lbnRzIGZyb20geSA9IDAgdG8gZG90cwogICAgICAgICAgIHJvdGF0ZSA9IEZBTFNFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBSb3RhdGUgdmVydGljYWxseQogICAgICAgICAgICMgZ3JvdXAgPSAiQ3l0b2tpbmVZIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgT3JkZXIgYnkgZ3JvdXBzCiAgICAgICAgICAgZG90LnNpemUgPSAxNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIExhcmdlIGRvdCBzaXplCiAgICAgICAgICAgbGFiZWwgPSByb3VuZCh0ZW1wJFNwZWFybWFuUmhvLCBkaWdpdHMgPSAzKSwgICAgICAgICAgICAgICAgICAgICAgICAjIEFkZCBtcGcgdmFsdWVzIGFzIGRvdCBsYWJlbHMKICAgICAgICAgICBmb250LmxhYmVsID0gbGlzdChjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSAxMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwLjUpICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICkKZ2dwYXIocDEsIGxlZ2VuZCA9ICIiLCAKICAgICAgbGVnZW5kLnRpdGxlID0gIiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCkpCgpnZ3NhdmUoZmlsZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLFRvZGF5LCIuQUVSTkFTRS5jbGluLmhkYWM5LiIsVFJBSVRfT0ZfSU5URVJFU1QsIl92c19DeXRva2luZXMuZG90Y2hhcnQucG5nIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS4iLFRSQUlUX09GX0lOVEVSRVNULCJfdnNfQ3l0b2tpbmVzLmRvdGNoYXJ0LnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgpybSh0ZW1wLCBwMSkKCmBgYAoKCiMjIEhEQUM5IHZzLiBjeXRva2luZXMgcGxhcXVlIGxldmVscwoKIyMjIE1vZGVsIDEKCkluIHRoaXMgbW9kZWwgd2UgY29ycmVjdCBmb3IgX0FnZV8sIF9HZW5kZXJfLCBhbmQgX3llYXIgb2Ygc3VyZ2VyeV8uCgpIZXJlIHdlIHVzZSB0aGUgaW52ZXJzZS1yYW5rIG5vcm1hbGl6ZWQgZGF0YSAtIHZpc3VhbGx5IHRoaXMgaXMgbW9yZSBub3JtYWxseSBkaXN0cmlidXRlZC4KCkFuYWx5c2lzIG9mIHBsYXF1ZSBjeXRva2luZXMgdHJhaXRzIGFzIGEgZnVuY3Rpb24gb2YgcGxhcXVlIHRhcmdldChzKSBsZXZlbHMuCgpgYGB7ciBDcm9zc1NlYzogQ3l0b2tpbmVzIC0gbGluZWFyIHJlZ3Jlc3Npb24gTU9ERUwxIFJBTkssIHBhZ2VkLnByaW50PVRSVUV9CgpHTE0ucmVzdWx0cyA8LSBkYXRhLmZyYW1lKG1hdHJpeChOQSwgbmNvbCA9IDE1LCBucm93ID0gMCkpCmNhdCgiUnVubmluZyBsaW5lYXIgcmVncmVzc2lvbi4uLlxuIikKZm9yIChwcm90ZWluIGluIDE6bGVuZ3RoKFRSQUlUUy5UQVJHRVQuUkFOSykpIHsKICBQUk9URUlOID0gVFJBSVRTLlRBUkdFVC5SQU5LW3Byb3RlaW5dCiAgY2F0KHBhc3RlMCgiXG5BbmFseXNpcyBvZiAiLFBST1RFSU4sIi5cbiIpKQogIGZvciAodHJhaXQgaW4gMTpsZW5ndGgocHJvdGVpbnNfb2ZfaW50ZXJlc3RfcmFuaykpIHsKICAgIFRSQUlUID0gcHJvdGVpbnNfb2ZfaW50ZXJlc3RfcmFua1t0cmFpdF0KICAgIGNhdChwYXN0ZTAoIlxuLSBwcm9jZXNzaW5nICIsVFJBSVQsIlxuXG4iKSkKICAgIGN1cnJlbnRERiA8LSBhcy5kYXRhLmZyYW1lKEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUKICAgICAgZHBseXI6OnNlbGVjdCguLCBQUk9URUlOLCBUUkFJVCwgQ09WQVJJQVRFU19NMSkgJT4lCiAgICAgIGZpbHRlcihjb21wbGV0ZS5jYXNlcyguKSkpICU+JQogICAgICBmaWx0ZXJfaWYofmlzLm51bWVyaWMoLiksIGFsbF92YXJzKCFpcy5pbmZpbml0ZSguKSkpCiAgICAjIGZvciBkZWJ1ZwogICAgIyBwcmludChEVDo6ZGF0YXRhYmxlKGN1cnJlbnRERikpCiAgICAjIHByaW50KG5yb3coY3VycmVudERGKSkKICAgICMgcHJpbnQoc3RyKGN1cnJlbnRERikpCiAgICAjIyMgdW5pdmFyaWF0ZQogICAgIyBmaXQgPC0gbG0oY3VycmVudERGWyxQUk9URUlOXSB+IGN1cnJlbnRERlssVFJBSVRdICsgQWdlICsgR2VuZGVyICsgT1JkYXRlX3llYXIsIGRhdGEgPSBjdXJyZW50REYpCiAgICBmaXQgPC0gbG0oY3VycmVudERGWyxQUk9URUlOXSB+IGN1cnJlbnRERlssVFJBSVRdICsgQWdlICsgR2VuZGVyICsgT1JkYXRlX2Vwb2NoLCBkYXRhID0gY3VycmVudERGKQogICAgbW9kZWxfc3RlcCA8LSBzdGVwQUlDKGZpdCwgZGlyZWN0aW9uID0gImJvdGgiLCB0cmFjZSA9IEZBTFNFKQogICAgcHJpbnQobW9kZWxfc3RlcCkKICAgIHByaW50KHN1bW1hcnkoZml0KSkKCiAgICBHTE0ucmVzdWx0cy5URU1QIDwtIGRhdGEuZnJhbWUobWF0cml4KE5BLCBuY29sID0gMTUsIG5yb3cgPSAwKSkKICAgIEdMTS5yZXN1bHRzLlRFTVBbMSxdID0gR0xNLkNPTihmaXQsICJBRURCLkNFQSIsIFBST1RFSU4sIFRSQUlULCB2ZXJib3NlID0gVFJVRSkKICAgIEdMTS5yZXN1bHRzID0gcmJpbmQoR0xNLnJlc3VsdHMsIEdMTS5yZXN1bHRzLlRFTVApCiAgfQp9CmNhdCgiRWRpdCB0aGUgY29sdW1uIG5hbWVzLi4uXG4iKQpjb2xuYW1lcyhHTE0ucmVzdWx0cykgPSBjKCJEYXRhc2V0IiwgIlByZWRpY3RvciIsICJUcmFpdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkJldGEiLCAicy5lLm0uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiT1IiLCAibG93OTVDSSIsICJ1cDk1Q0kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJULXZhbHVlIiwgIlAtdmFsdWUiLCAicl4yIiwgInJeMl9hZGoiLCAiTiIsICJNb2RlbF9OIiwgIlBlcmNfTWlzcyIpCgpjYXQoIkNvcnJlY3QgdGhlIHZhcmlhYmxlIHR5cGVzLi4uXG4iKQpHTE0ucmVzdWx0cyRCZXRhIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkQmV0YSkKR0xNLnJlc3VsdHMkcy5lLm0uIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkcy5lLm0uKQpHTE0ucmVzdWx0cyRPUiA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJE9SKQpHTE0ucmVzdWx0cyRsb3c5NUNJIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkbG93OTVDSSkKR0xNLnJlc3VsdHMkdXA5NUNJIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkdXA5NUNJKQpHTE0ucmVzdWx0cyRgVC12YWx1ZWAgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRgVC12YWx1ZWApCkdMTS5yZXN1bHRzJGBQLXZhbHVlYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGBQLXZhbHVlYCkKR0xNLnJlc3VsdHMkYHJeMmAgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRgcl4yYCkKR0xNLnJlc3VsdHMkYHJeMl9hZGpgIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYHJeMl9hZGpgKQpHTE0ucmVzdWx0cyRgTmAgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRgTmApCkdMTS5yZXN1bHRzJGBNb2RlbF9OYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGBNb2RlbF9OYCkKR0xNLnJlc3VsdHMkYFBlcmNfTWlzc2AgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRgUGVyY19NaXNzYCkKCmBgYAoKYGBge3IgQ3Jvc3NTZWM6IEN5dG9raW5lcyAtIGxpbmVhciByZWdyZXNzaW9uIE1PREVMMSBSQU5LIFdyaXRpbmd9CkRUOjpkYXRhdGFibGUoR0xNLnJlc3VsdHMpCgojIFNhdmUgdGhlIGRhdGEKY2F0KCJXcml0aW5nIHJlc3VsdHMgdG8gRXhjZWwtZmlsZS4uLlxuIikKIyMjIFVuaXZhcmlhdGUKbGlicmFyeShvcGVueGxzeCkKd3JpdGUueGxzeChHTE0ucmVzdWx0cywKICAgICAgICAgICBmaWxlID0gcGFzdGUwKE9VVF9sb2MsICIvIixUb2RheSwiLkFFUk5BU0UuY2xpbi5oZGFjOS5Db24uVW5pLiIsVFJBSVRfT0ZfSU5URVJFU1QsIl9QbGFxdWUuQ3l0b2tpbmVzX1BsYXF1ZXMuUkFOSy5NT0RFTDEueGxzeCIpLAogICAgICAgICAgIHJvd05tZXMgPSBGQUxTRSwgY29sTmFtZXMgPSBUUlVFLCBzaGVldE5hbWUgPSAiQ29uLlVuaS5QbGFxdWVQaGVubyIpCiMgUmVtb3ZpbmcgaW50ZXJtZWRpYXRlcwpjYXQoIlJlbW92aW5nIGludGVybWVkaWF0ZSBmaWxlcy4uLlxuIikKcm0oVFJBSVQsIHRyYWl0LCBjdXJyZW50REYsIEdMTS5yZXN1bHRzLCBHTE0ucmVzdWx0cy5URU1QLCBmaXQsIG1vZGVsX3N0ZXApCgoKYGBgCgoKCiMjIyBNb2RlbCAyCgpJbiB0aGlzIG1vZGVsIHdlIGNvcnJlY3QgZm9yIF9BZ2VfLCBfR2VuZGVyXywgX3llYXIgb2Ygc3VyZ2VyeV8sIF9IeXBlcnRlbnNpb24gc3RhdHVzXywgX0RpYWJldGVzIHN0YXR1c18sIF9jdXJyZW50IHNtb2tlciBzdGF0dXNfLCBfbGlwaWQtbG93ZXJpbmcgZHJ1Z3MgKExMRHMpXywgX2FudGlwbGF0ZWxldCBtZWRpY2F0aW9uXywgX2VHRlIgKE1EUkQpXywgX0JNSV8sIF9NZWRIeF9DVkRfIChjb21iaW5hdGlvbiBvZiBfQ0FEIGhpc3RvcnlfLCBfc3Ryb2tlIGhpc3RvcnlfLCBhbmQgX3BlcmlwaGVyYWwgaW50ZXJ2ZW50aW9uc18pLCBhbmQgX3N0ZW5vc2lzXy4KCkhlcmUgd2UgdXNlIHRoZSBpbnZlcnNlLXJhbmsgbm9ybWFsaXplZCBkYXRhIC0gdmlzdWFsbHkgdGhpcyBpcyBtb3JlIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLgoKQW5hbHlzaXMgb2YgcGxhcXVlIGN5dG9raW5lcyBhcyBhIGZ1bmN0aW9uIG9mIHBsYXF1ZSB0YXJnZXQocykgbGV2ZWxzLgoKYGBge3IgQ3Jvc3NTZWM6IEN5dG9raW5lcyAtIGxpbmVhciByZWdyZXNzaW9uIE1PREVMMiBSQU5LLCBwYWdlZC5wcmludD1UUlVFfQoKR0xNLnJlc3VsdHMgPC0gZGF0YS5mcmFtZShtYXRyaXgoTkEsIG5jb2wgPSAxNSwgbnJvdyA9IDApKQpjYXQoIlJ1bm5pbmcgbGluZWFyIHJlZ3Jlc3Npb24uLi5cbiIpCmZvciAocHJvdGVpbiBpbiAxOmxlbmd0aChUUkFJVFMuVEFSR0VULlJBTkspKSB7CiAgUFJPVEVJTiA9IFRSQUlUUy5UQVJHRVQuUkFOS1twcm90ZWluXQogIGNhdChwYXN0ZTAoIlxuQW5hbHlzaXMgb2YgIixQUk9URUlOLCIuXG4iKSkKICBmb3IgKHRyYWl0IGluIDE6bGVuZ3RoKHByb3RlaW5zX29mX2ludGVyZXN0X3JhbmspKSB7CiAgICBUUkFJVCA9IHByb3RlaW5zX29mX2ludGVyZXN0X3JhbmtbdHJhaXRdCiAgICBjYXQocGFzdGUwKCJcbi0gcHJvY2Vzc2luZyAiLFRSQUlULCJcblxuIikpCiAgICBjdXJyZW50REYgPC0gYXMuZGF0YS5mcmFtZShBRVJOQVNFLmNsaW4uaGRhYzkgJT4lCiAgICAgIGRwbHlyOjpzZWxlY3QoLiwgUFJPVEVJTiwgVFJBSVQsIENPVkFSSUFURVNfTTIpICU+JQogICAgICBmaWx0ZXIoY29tcGxldGUuY2FzZXMoLikpKSAlPiUKICAgICAgZmlsdGVyX2lmKH5pcy5udW1lcmljKC4pLCBhbGxfdmFycyghaXMuaW5maW5pdGUoLikpKQogICAgIyBmb3IgZGVidWcKICAgICMgcHJpbnQoRFQ6OmRhdGF0YWJsZShjdXJyZW50REYpKQogICAgIyBwcmludChucm93KGN1cnJlbnRERikpCiAgICAjIHByaW50KHN0cihjdXJyZW50REYpKQogICAgIyMjIHVuaXZhcmlhdGUKICAgICMgZml0IDwtIGxtKGN1cnJlbnRERlssUFJPVEVJTl0gfiBjdXJyZW50REZbLFRSQUlUXSArIEFnZSArIEdlbmRlciArIE9SZGF0ZV95ZWFyICsgCiAgICAjICAgICAgICAgICAgIEh5cGVydGVuc2lvbi5jb21wb3NpdGUgKyBEaWFiZXRlc1N0YXR1cyArIFNtb2tlclN0YXR1cyArIAogICAgIyAgICAgICAgICAgICBNZWQuU3RhdGluLkxMRCArIE1lZC5hbGwuYW50aXBsYXRlbGV0ICsgR0ZSX01EUkQgKyBCTUkgKyAKICAgICMgICAgICAgICAgICAgTWVkSHhfQ1ZEICsgc3Rlbm9zZSwgCiAgICAjICAgICAgICAgICBkYXRhID0gY3VycmVudERGKQogICAgZml0IDwtIGxtKGN1cnJlbnRERlssUFJPVEVJTl0gfiBjdXJyZW50REZbLFRSQUlUXSArIEFnZSArIEdlbmRlciArIE9SZGF0ZV9lcG9jaCArIAogICAgICAgICAgICAgICAgSHlwZXJ0ZW5zaW9uLmNvbXBvc2l0ZSArIERpYWJldGVzU3RhdHVzICsgU21va2VyU3RhdHVzICsgCiAgICAgICAgICAgICAgICBNZWQuU3RhdGluLkxMRCArIE1lZC5hbGwuYW50aXBsYXRlbGV0ICsgR0ZSX01EUkQgKyBCTUkgKyAKICAgICAgICAgICAgICAgIE1lZEh4X0NWRCArIHN0ZW5vc2UsIAogICAgICAgICAgICAgIGRhdGEgPSBjdXJyZW50REYpCiAgICBtb2RlbF9zdGVwIDwtIHN0ZXBBSUMoZml0LCBkaXJlY3Rpb24gPSAiYm90aCIsIHRyYWNlID0gRkFMU0UpCiAgICBwcmludChtb2RlbF9zdGVwKQogICAgcHJpbnQoc3VtbWFyeShmaXQpKQogICAgCiAgICBHTE0ucmVzdWx0cy5URU1QIDwtIGRhdGEuZnJhbWUobWF0cml4KE5BLCBuY29sID0gMTUsIG5yb3cgPSAwKSkKICAgIEdMTS5yZXN1bHRzLlRFTVBbMSxdID0gR0xNLkNPTihmaXQsICJBRURCLkNFQSIsIFBST1RFSU4sIFRSQUlULCB2ZXJib3NlID0gVFJVRSkKICAgIEdMTS5yZXN1bHRzID0gcmJpbmQoR0xNLnJlc3VsdHMsIEdMTS5yZXN1bHRzLlRFTVApCiAgfQp9CmNhdCgiRWRpdCB0aGUgY29sdW1uIG5hbWVzLi4uXG4iKQpjb2xuYW1lcyhHTE0ucmVzdWx0cykgPSBjKCJEYXRhc2V0IiwgIlByZWRpY3RvciIsICJUcmFpdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkJldGEiLCAicy5lLm0uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiT1IiLCAibG93OTVDSSIsICJ1cDk1Q0kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJULXZhbHVlIiwgIlAtdmFsdWUiLCAicl4yIiwgInJeMl9hZGoiLCAiTiIsICJNb2RlbF9OIiwgIlBlcmNfTWlzcyIpCgpjYXQoIkNvcnJlY3QgdGhlIHZhcmlhYmxlIHR5cGVzLi4uXG4iKQpHTE0ucmVzdWx0cyRCZXRhIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkQmV0YSkKR0xNLnJlc3VsdHMkcy5lLm0uIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkcy5lLm0uKQpHTE0ucmVzdWx0cyRPUiA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJE9SKQpHTE0ucmVzdWx0cyRsb3c5NUNJIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkbG93OTVDSSkKR0xNLnJlc3VsdHMkdXA5NUNJIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkdXA5NUNJKQpHTE0ucmVzdWx0cyRgVC12YWx1ZWAgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRgVC12YWx1ZWApCkdMTS5yZXN1bHRzJGBQLXZhbHVlYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGBQLXZhbHVlYCkKR0xNLnJlc3VsdHMkYHJeMmAgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRgcl4yYCkKR0xNLnJlc3VsdHMkYHJeMl9hZGpgIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYHJeMl9hZGpgKQpHTE0ucmVzdWx0cyRgTmAgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRgTmApCkdMTS5yZXN1bHRzJGBNb2RlbF9OYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGBNb2RlbF9OYCkKR0xNLnJlc3VsdHMkYFBlcmNfTWlzc2AgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRgUGVyY19NaXNzYCkKCmBgYAoKYGBge3IgQ3Jvc3NTZWM6IEN5dG9raW5lcyAtIGxpbmVhciByZWdyZXNzaW9uIE1PREVMMiBSQU5LLCB3cml0aW5nfQpEVDo6ZGF0YXRhYmxlKEdMTS5yZXN1bHRzKQoKIyBTYXZlIHRoZSBkYXRhCmNhdCgiV3JpdGluZyByZXN1bHRzIHRvIEV4Y2VsLWZpbGUuLi5cbiIpCiMjIyBVbml2YXJpYXRlCmxpYnJhcnkob3Blbnhsc3gpCndyaXRlLnhsc3goR0xNLnJlc3VsdHMsCiAgICAgICAgICAgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsVG9kYXksIi5BRVJOQVNFLmNsaW4uaGRhYzkuQ29uLk11bHRpLiIsVFJBSVRfT0ZfSU5URVJFU1QsIl9QbGFxdWUuQ3l0b2tpbmVzX1BsYXF1ZXMuUkFOSy5NT0RFTDIueGxzeCIpLAogICAgICAgICAgIHJvd05hbWVzID0gRkFMU0UsIGNvbE5hbWVzID0gVFJVRSwgc2hlZXROYW1lID0gIkNvbi5NdWx0aS5QbGFxdWVQaGVubyIpCiMgUmVtb3ZpbmcgaW50ZXJtZWRpYXRlcwpjYXQoIlJlbW92aW5nIGludGVybWVkaWF0ZSBmaWxlcy4uLlxuIikKcm0oVFJBSVQsIHRyYWl0LCBjdXJyZW50REYsIEdMTS5yZXN1bHRzLCBHTE0ucmVzdWx0cy5URU1QLCBmaXQsIG1vZGVsX3N0ZXApCgoKYGBgCgojIyBIREFDOSBsZXZlbHMgdnMuIHZ1bG5lcmFiaWxpdHkgaW5kZXgKCgpIZXJlIHdlIHBsb3QgdGhlIGxldmVscyBvZiBpbnZlcnNlLXJhbmsgbm9ybWFsIHRyYW5zZm9ybWVkIHRhcmdldChzKSBwbGFxdWUgbGV2ZWxzIGZyb20gZXhwZXJpbWVudCAxIGFuZCAyIHRvIHRoZSBgUGxhcXVlIHZ1bG5lcmFiaWxpdHkgaW5kZXhgLiAKCmBgYHtyIEZpeCBPUnllYXJHcm91cCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShzamxhYmVsbGVkKQoKQUVSTkFTRS5jbGluLmhkYWM5JHllYXJ0ZW1wIDwtIGFzLm51bWVyaWMoeWVhcihBRVJOQVNFLmNsaW4uaGRhYzkkZGF0ZW9rKSkKCmF0dGFjaChBRVJOQVNFLmNsaW4uaGRhYzkpCgpBRVJOQVNFLmNsaW4uaGRhYzlbLCJPUnllYXJHcm91cCJdIDwtIE5BCkFFUk5BU0UuY2xpbi5oZGFjOSRPUnllYXJHcm91cFt5ZWFydGVtcCA8PSAyMDA3XSA8LSAiPCAyMDA3IgpBRVJOQVNFLmNsaW4uaGRhYzkkT1J5ZWFyR3JvdXBbeWVhcnRlbXAgPiAyMDA3XSA8LSAiPiAyMDA3IgpkZXRhY2goQUVSTkFTRS5jbGluLmhkYWM5KQoKdGFibGUoQUVSTkFTRS5jbGluLmhkYWM5JE9SeWVhckdyb3VwLCBBRVJOQVNFLmNsaW4uaGRhYzkkT1JkYXRlX3llYXIpCmBgYAoKIyMjIFZpc3VhbGlzYXRpb25zCgpgYGB7ciBwZXIgUGxhcXVlVnVsbmVyYWJpbGl0eUluZGV4fQojIEdsb2JhbCB0ZXN0CmNvbXBhcmVfbWVhbnMoSERBQzkgfiBQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCwgIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpwMSA8LSBnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzksIAogICAgICAgICAgICAgICAgICB4ID0gIlBsYXF1ZV9WdWxuZXJhYmlsaXR5X0luZGV4IiwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIlBsYXF1ZSB2dWxuZXJhYmlsaXR5IGluZGV4IiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKVxuIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiLCAKICAgICAgICAgICAgICAgICAgYWRkLnBhcmFtcyA9IGxpc3Qoc2l6ZSA9IDIsIGppdHRlciA9IDAuMikpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwgPSAicC5mb3JtYXQiLCAgbWV0aG9kID0gImtydXNrYWwudGVzdCIpICsKICBmb250KCJ4bGFiIiwgc2l6ZSA9IDE3KSArCiAgZm9udCgieWxhYiIsIHNpemUgPSAxNykgKwogIGZvbnQoInh5LnRleHQiLCBzaXplID0gMTYpICsKICBmb250KCJsZWdlbmQudGl0bGUiLCBmYWNlID0gImJvbGQiKSAKICAKZ2dwYXIocDEsIGxlZ2VuZCA9ICJib3R0b20iLCBsZWdlbmQudGl0bGUgPSAiUGxhcXVlIHZ1bG5lcmFiaWxpdHkgaW5kZXgiKQoKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5wbGFxdWUuUGxhcXVlVnVsbmVyYWJpbGl0eUluZGV4LnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCmBgYAoKYGBge3J9CmNvbXBhcmVfbWVhbnMoSERBQzlfbWF4MTAwIH4gUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgsICBkYXRhID0gQUVSTkFTRS5jbGluLmhkYWM5LCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKcDEgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5LCAKICAgICAgICAgICAgICAgICAgeCA9ICJQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCIsCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzlfbWF4MTAwIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiUGxhcXVlIHZ1bG5lcmFiaWxpdHkgaW5kZXgiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pXG4iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAibnBnIiwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIsIAogICAgICAgICAgICAgICAgICBhZGQucGFyYW1zID0gbGlzdChzaXplID0gMiwgaml0dGVyID0gMC4yKSkgKwogIHN0YXRfY29tcGFyZV9tZWFucyhsYWJlbCA9ICJwLmZvcm1hdCIsICBtZXRob2QgPSAia3J1c2thbC50ZXN0IikgKwogIGZvbnQoInhsYWIiLCBzaXplID0gMTcpICsKICBmb250KCJ5bGFiIiwgc2l6ZSA9IDE3KSArCiAgZm9udCgieHkudGV4dCIsIHNpemUgPSAxNikgKwogIGZvbnQoImxlZ2VuZC50aXRsZSIsIGZhY2UgPSAiYm9sZCIpIAogIApnZ3BhcihwMSwgbGVnZW5kID0gImJvdHRvbSIsIGxlZ2VuZC50aXRsZSA9ICJQbGFxdWUgdnVsbmVyYWJpbGl0eSBpbmRleCIpCgpnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuIixUUkFJVF9PRl9JTlRFUkVTVCwiLm1heDEwMC5wbGFxdWUuUGxhcXVlVnVsbmVyYWJpbGl0eUluZGV4LnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCmBgYAoKCmBgYHtyIH0KIyBHbG9iYWwgdGVzdApjb21wYXJlX21lYW5zKEhEQUM5IH4gUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgsICBkYXRhID0gQUVSTkFTRS5jbGluLmhkYWM5LCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKCnAxIDwtIGdncHVicjo6Z2diYXJwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSwgCiAgICAgICAgICAgICAgICAgIHggPSAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5IiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiUGxhcXVlIHZ1bG5lcmFiaWxpdHkgaW5kZXgiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pXG4iLAogICAgICAgICAgICAgICAgICBjb2wgPSAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiLAogICAgICAgICAgICAgICAgICBmaWxsID0gIlBsYXF1ZV9WdWxuZXJhYmlsaXR5X0luZGV4IiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJucGciLAogICAgICAgICAgICAgICAgICBhZGQgPSAibWVkaWFuX2lxciIsIGVycm9yLnBsb3QgPSAidXBwZXJfZXJyb3JiYXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGxhYmVsID0gInAuZm9ybWF0IiwgIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiLAogICAgICAgICAgICAgICAgICAgICBsYWJlbC54ID0gMSwgbGFiZWwueSA9IDUwKSArCiAgZm9udCgieGxhYiIsIHNpemUgPSAxNykgKwogIGZvbnQoInlsYWIiLCBzaXplID0gMTcpICsKICBmb250KCJ4eS50ZXh0Iiwgc2l6ZSA9IDE2KSArCiAgZm9udCgibGVnZW5kLnRpdGxlIiwgZmFjZSA9ICJib2xkIikgCiAgCmdncGFyKHAxLCBsZWdlbmQgPSAiYm90dG9tIiwgbGVnZW5kLnRpdGxlID0gIlBsYXF1ZSB2dWxuZXJhYmlsaXR5IGluZGV4IiwgeWxpbSA9IGMoMCwgNTUpKQoKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5wbGFxdWUuUGxhcXVlVnVsbmVyYWJpbGl0eUluZGV4LkJhclBsb3QubWVkaWFuX2lxci5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKYGBgCgpgYGB7cn0KY29tcGFyZV9tZWFucyhIREFDOV9tYXgxMDAgfiBQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCwgIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQoKcDEgPC0gZ2dwdWJyOjpnZ2JhcnBsb3QoQUVSTkFTRS5jbGluLmhkYWM5LCAKICAgICAgICAgICAgICAgICAgeCA9ICJQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCIsCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzlfbWF4MTAwIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiUGxhcXVlIHZ1bG5lcmFiaWxpdHkgaW5kZXgiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pXG4iLAogICAgICAgICAgICAgICAgICBjb2wgPSAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiLAogICAgICAgICAgICAgICAgICBmaWxsID0gIlBsYXF1ZV9WdWxuZXJhYmlsaXR5X0luZGV4IiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJucGciLAogICAgICAgICAgICAgICAgICBhZGQgPSAibWVkaWFuX2lxciIsIGVycm9yLnBsb3QgPSAidXBwZXJfZXJyb3JiYXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGxhYmVsID0gInAuZm9ybWF0IiwgIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiLAogICAgICAgICAgICAgICAgICAgICBsYWJlbC54ID0gMSwgbGFiZWwueSA9IDUwKSArCiAgZm9udCgieGxhYiIsIHNpemUgPSAxNykgKwogIGZvbnQoInlsYWIiLCBzaXplID0gMTcpICsKICBmb250KCJ4eS50ZXh0Iiwgc2l6ZSA9IDE2KSArCiAgZm9udCgibGVnZW5kLnRpdGxlIiwgZmFjZSA9ICJib2xkIikgCiAgCmdncGFyKHAxLCBsZWdlbmQgPSAiYm90dG9tIiwgbGVnZW5kLnRpdGxlID0gIlBsYXF1ZSB2dWxuZXJhYmlsaXR5IGluZGV4IiwgeWxpbSA9IGMoMCwgNTUpKQoKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5tYXgxMDAucGxhcXVlLlBsYXF1ZVZ1bG5lcmFiaWxpdHlJbmRleC5CYXJQbG90Lm1lZGlhbl9pcXIucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmBgYAoKCmBgYHtyfQpwMSA8LSBnZ3B1YnI6OmdnYmFycGxvdChBRVJOQVNFLmNsaW4uaGRhYzksIAogICAgICAgICAgICAgICAgICB4ID0gIlBsYXF1ZV9WdWxuZXJhYmlsaXR5X0luZGV4IiwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIlBsYXF1ZSB2dWxuZXJhYmlsaXR5IGluZGV4IiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKVxuIiwKICAgICAgICAgICAgICAgICAgY29sID0gIlBsYXF1ZV9WdWxuZXJhYmlsaXR5X0luZGV4IiwKICAgICAgICAgICAgICAgICAgZmlsbCA9ICJQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAibnBnIiwKICAgICAgICAgICAgICAgICAgYWRkID0gIm1lYW5fc2UiLCBlcnJvci5wbG90ID0gInVwcGVyX2Vycm9yYmFyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhsYWJlbCA9ICJwLmZvcm1hdCIsICBtZXRob2QgPSAia3J1c2thbC50ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgbGFiZWwueCA9IDEsIGxhYmVsLnkgPSA1MCkgKwogIGZvbnQoInhsYWIiLCBzaXplID0gMTcpICsKICBmb250KCJ5bGFiIiwgc2l6ZSA9IDE3KSArCiAgZm9udCgieHkudGV4dCIsIHNpemUgPSAxNikgKwogIGZvbnQoImxlZ2VuZC50aXRsZSIsIGZhY2UgPSAiYm9sZCIpIAogIApnZ3BhcihwMSwgbGVnZW5kID0gImJvdHRvbSIsIGxlZ2VuZC50aXRsZSA9ICJQbGFxdWUgdnVsbmVyYWJpbGl0eSBpbmRleCIsIHlsaW0gPSBjKDAsIDU1KSkKCmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi4iLFRSQUlUX09GX0lOVEVSRVNULCIucGxhcXVlLlBsYXF1ZVZ1bG5lcmFiaWxpdHlJbmRleC5CYXJQbG90Lm1lYW5zX3NlLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgpgYGAKCmBgYHtyfQpwMSA8LSBnZ3B1YnI6OmdnYmFycGxvdChBRVJOQVNFLmNsaW4uaGRhYzksIAogICAgICAgICAgICAgICAgICB4ID0gIlBsYXF1ZV9WdWxuZXJhYmlsaXR5X0luZGV4IiwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOV9tYXgxMDAiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJQbGFxdWUgdnVsbmVyYWJpbGl0eSBpbmRleCIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbilcbiIsCiAgICAgICAgICAgICAgICAgIGNvbCA9ICJQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCIsCiAgICAgICAgICAgICAgICAgIGZpbGwgPSAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJtZWFuX3NlIiwgZXJyb3IucGxvdCA9ICJ1cHBlcl9lcnJvcmJhciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwgPSAicC5mb3JtYXQiLCAgbWV0aG9kID0gImtydXNrYWwudGVzdCIsCiAgICAgICAgICAgICAgICAgICAgIGxhYmVsLnggPSAxLCBsYWJlbC55ID0gNTApICsKICBmb250KCJ4bGFiIiwgc2l6ZSA9IDE3KSArCiAgZm9udCgieWxhYiIsIHNpemUgPSAxNykgKwogIGZvbnQoInh5LnRleHQiLCBzaXplID0gMTYpICsKICBmb250KCJsZWdlbmQudGl0bGUiLCBmYWNlID0gImJvbGQiKSAKICAKZ2dwYXIocDEsIGxlZ2VuZCA9ICJib3R0b20iLCBsZWdlbmQudGl0bGUgPSAiUGxhcXVlIHZ1bG5lcmFiaWxpdHkgaW5kZXgiLCB5bGltID0gYygwLCA1NSkpCgpnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuIixUUkFJVF9PRl9JTlRFUkVTVCwiLm1heDEwMC5wbGFxdWUuUGxhcXVlVnVsbmVyYWJpbGl0eUluZGV4LkJhclBsb3QubWVhbnNfc2UucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKYGBgCgoKYGBge3J9CmNvbXBhcmVfbWVhbnMoSERBQzkgfiBQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCwgIGRhdGEgPSBzdWJzZXQoQUVSTkFTRS5jbGluLmhkYWM5LCBIREFDOSA8MTAwKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCgpwMSA8LSBnZ3B1YnI6OmdnYm94cGxvdChzdWJzZXQoQUVSTkFTRS5jbGluLmhkYWM5LCBIREFDOSA8MTAwKSAsIAogICAgICAgICAgICAgICAgICB4ID0gIlBsYXF1ZV9WdWxuZXJhYmlsaXR5X0luZGV4IiwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIlBsYXF1ZSB2dWxuZXJhYmlsaXR5IGluZGV4IiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKVxub3V0bGllcnMgYWJvdmUgMTAwIGFyZSByZW1vdmVkIiwKICAgICAgICAgICAgICAgICAgY29sID0gIlBsYXF1ZV9WdWxuZXJhYmlsaXR5X0luZGV4IiwKICAgICAgICAgICAgICAgICAgZmlsbCA9ICJQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAibnBnIiwKICAgICAgICAgICAgICAgICAgYWRkID0gImJveHBsb3QiLCBlcnJvci5wbG90ID0gImNyb3NzYmFyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhsYWJlbCA9ICJwLmZvcm1hdCIsICBtZXRob2QgPSAia3J1c2thbC50ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgbGFiZWwueCA9IDEsIGxhYmVsLnkgPSA1MCkgKwogIGZvbnQoInhsYWIiLCBzaXplID0gMTcpICsKICBmb250KCJ5bGFiIiwgc2l6ZSA9IDE3KSArCiAgZm9udCgieHkudGV4dCIsIHNpemUgPSAxNikgKwogIGZvbnQoImxlZ2VuZC50aXRsZSIsIGZhY2UgPSAiYm9sZCIpIAogIApnZ3BhcihwMSwgbGVnZW5kID0gImJvdHRvbSIsIGxlZ2VuZC50aXRsZSA9ICJQbGFxdWUgdnVsbmVyYWJpbGl0eSBpbmRleCIpCgpnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuIixUUkFJVF9PRl9JTlRFUkVTVCwiLnBsYXF1ZS5QbGFxdWVWdWxuZXJhYmlsaXR5SW5kZXguQm94cGxvdC5vdXRsaWVyX2Fib3ZlXzEwMF9yZW1vdmVkLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgpgYGAKCmBgYHtyfQpjb21wYXJlX21lYW5zKEhEQUM5IH4gUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgsICBkYXRhID0gQUVSTkFTRS5jbGluLmhkYWM5LCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKcDEgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5LCAKICAgICAgICAgICAgICAgICAgeCA9ICJQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCIsCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzkiLCAKICAgICAgICAgICAgICAgICAgZmFjZXQuYnkgPSAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiLAogICAgICAgICAgICAgICAgICB4bGFiID0gIlBsYXF1ZSB2dWxuZXJhYmlsaXR5IGluZGV4IiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKVxuIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiLCAKICAgICAgICAgICAgICAgICAgYWRkLnBhcmFtcyA9IGxpc3Qoc2l6ZSA9IDIsIGppdHRlciA9IDAuMikpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwgPSAicC5mb3JtYXQiLCAgbWV0aG9kID0gImtydXNrYWwudGVzdCIpICsKICBmb250KCJ4bGFiIiwgc2l6ZSA9IDE3KSArCiAgZm9udCgieWxhYiIsIHNpemUgPSAxNykgKwogIGZvbnQoInh5LnRleHQiLCBzaXplID0gMTYpICsKICBmb250KCJsZWdlbmQudGl0bGUiLCBmYWNlID0gImJvbGQiKSAKICAKZ2dwYXIocDEsIGxlZ2VuZCA9ICJib3R0b20iLCBsZWdlbmQudGl0bGUgPSAiUGxhcXVlIHZ1bG5lcmFiaWxpdHkgaW5kZXgiKQoKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5wbGFxdWUuRmFjZXRCeVBsYXF1ZVZ1bG5lcmFiaWxpdHlJbmRleC5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQpgYGAKCmBgYHtyfQpjb21wYXJlX21lYW5zKEhEQUM5X21heDEwMCB+IFBsYXF1ZV9WdWxuZXJhYmlsaXR5X0luZGV4LCAgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCnAxIDwtIGdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSwgCiAgICAgICAgICAgICAgICAgIHggPSAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5X21heDEwMCIsIAogICAgICAgICAgICAgICAgICBmYWNldC5ieSA9ICJQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCIsCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiUGxhcXVlIHZ1bG5lcmFiaWxpdHkgaW5kZXgiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pXG4iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAibnBnIiwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIsIAogICAgICAgICAgICAgICAgICBhZGQucGFyYW1zID0gbGlzdChzaXplID0gMiwgaml0dGVyID0gMC4yKSkgKwogIHN0YXRfY29tcGFyZV9tZWFucyhsYWJlbCA9ICJwLmZvcm1hdCIsICBtZXRob2QgPSAia3J1c2thbC50ZXN0IikgKwogIGZvbnQoInhsYWIiLCBzaXplID0gMTcpICsKICBmb250KCJ5bGFiIiwgc2l6ZSA9IDE3KSArCiAgZm9udCgieHkudGV4dCIsIHNpemUgPSAxNikgKwogIGZvbnQoImxlZ2VuZC50aXRsZSIsIGZhY2UgPSAiYm9sZCIpIAogIApnZ3BhcihwMSwgbGVnZW5kID0gImJvdHRvbSIsIGxlZ2VuZC50aXRsZSA9ICJQbGFxdWUgdnVsbmVyYWJpbGl0eSBpbmRleCIpCgpnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuIixUUkFJVF9PRl9JTlRFUkVTVCwiLm1heDEwMC5wbGFxdWUuRmFjZXRCeVBsYXF1ZVZ1bG5lcmFiaWxpdHlJbmRleC5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQpgYGAKCgoKYGBge3J9CmNvbXBhcmVfbWVhbnMoSERBQzkgfiBQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCwgZ3JvdXAuYnkgPSAiR2VuZGVyIiwgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCnAyIDwtIGdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSwgCiAgICAgICAgICAgICAgICAgIHggPSAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5IiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiUGxhcXVlIHZ1bG5lcmFiaWxpdHkgaW5kZXggYnkgZ2VuZGVyIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKVxuIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhhZXMoZ3JvdXAgPSBHZW5kZXIpLCBsYWJlbCA9ICJwLmZvcm1hdCIsICBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwYXIocDIsIGxlZ2VuZCA9ICJib3R0b20iLCBsZWdlbmQudGl0bGUgPSAiUGxhcXVlIHZ1bG5lcmFiaWxpdHkgaW5kZXgiKQpnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuIixUUkFJVF9PRl9JTlRFUkVTVCwiLnBsYXF1ZS5QbGFxdWVWdWxuZXJhYmlsaXR5SW5kZXguYnlHZW5kZXIucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmBgYAoKYGBge3J9CmNvbXBhcmVfbWVhbnMoSERBQzlfbWF4MTAwIH4gUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgsIGdyb3VwLmJ5ID0gIkdlbmRlciIsIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpwMiA8LSBnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzksIAogICAgICAgICAgICAgICAgICB4ID0gIlBsYXF1ZV9WdWxuZXJhYmlsaXR5X0luZGV4IiwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOV9tYXgxMDAiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJQbGFxdWUgdnVsbmVyYWJpbGl0eSBpbmRleCBieSBnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pXG4iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IEdlbmRlciksIGxhYmVsID0gInAuZm9ybWF0IiwgIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3BhcihwMiwgbGVnZW5kID0gImJvdHRvbSIsIGxlZ2VuZC50aXRsZSA9ICJQbGFxdWUgdnVsbmVyYWJpbGl0eSBpbmRleCIpCmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi4iLFRSQUlUX09GX0lOVEVSRVNULCIubWF4MTAwLnBsYXF1ZS5QbGFxdWVWdWxuZXJhYmlsaXR5SW5kZXguYnlHZW5kZXIucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKYGBgCgoKYGBge3J9Cgpjb21wYXJlX21lYW5zKEhEQUM5IH4gUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgsIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpwNSA8LSBnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzksIAogICAgICAgICAgICAgICAgICB4ID0gIlBsYXF1ZV9WdWxuZXJhYmlsaXR5X0luZGV4IiwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIlBsYXF1ZSB2dWxuZXJhYmlsaXR5IGluZGV4IiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKVxuIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGZhY2V0LmJ5ID0gIk9SeWVhckdyb3VwIiwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwgPSAicC5mb3JtYXQiLCAgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncGFyKHA1LCBsZWdlbmQgPSAiYm90dG9tIiwgbGVnZW5kLnRpdGxlID0gIlBsYXF1ZSB2dWxuZXJhYmlsaXR5IGluZGV4IikKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5wbGFxdWUuUGxhcXVlVnVsbmVyYWJpbGl0eUluZGV4X0ZhY2V0X2J5WWVhci5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQpgYGAKCmBgYHtyfQpjb21wYXJlX21lYW5zKEhEQUM5X21heDEwMCB+IFBsYXF1ZV9WdWxuZXJhYmlsaXR5X0luZGV4LCBkYXRhID0gQUVSTkFTRS5jbGluLmhkYWM5LCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKcDUgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5LCAKICAgICAgICAgICAgICAgICAgeCA9ICJQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCIsCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzlfbWF4MTAwIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiUGxhcXVlIHZ1bG5lcmFiaWxpdHkgaW5kZXgiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pXG4iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAibnBnIiwKICAgICAgICAgICAgICAgICAgZmFjZXQuYnkgPSAiT1J5ZWFyR3JvdXAiLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhsYWJlbCA9ICJwLmZvcm1hdCIsICBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwYXIocDUsIGxlZ2VuZCA9ICJib3R0b20iLCBsZWdlbmQudGl0bGUgPSAiUGxhcXVlIHZ1bG5lcmFiaWxpdHkgaW5kZXgiKQpnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuIixUUkFJVF9PRl9JTlRFUkVTVCwiLm1heDEwMC5wbGFxdWUuUGxhcXVlVnVsbmVyYWJpbGl0eUluZGV4X0ZhY2V0X2J5WWVhci5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQpgYGAKCgoKYGBge3J9CmNvbXBhcmVfbWVhbnMoSERBQzkgfiBQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCwgZ3JvdXAuYnkgPSAiR2VuZGVyIiwgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCnA2IDwtIGdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSwgCiAgICAgICAgICAgICAgICAgIHggPSAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5IiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiUGxhcXVlIHZ1bG5lcmFiaWxpdHkgaW5kZXgiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pXG4iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGZhY2V0LmJ5ID0gIk9SeWVhckdyb3VwIiwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoYWVzKGdyb3VwID0gR2VuZGVyKSwgbGFiZWwgPSAicC5mb3JtYXQiLCAgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncGFyKHA2LCBsZWdlbmQgPSAiYm90dG9tIiwgbGVnZW5kLnRpdGxlID0gIlBsYXF1ZSB2dWxuZXJhYmlsaXR5IGluZGV4IikKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5wbGFxdWUuUGxhcXVlVnVsbmVyYWJpbGl0eUluZGV4X0ZhY2V0X2J5WWVhci5ieUdlbmRlci5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKYGBgCgpgYGB7cn0KY29tcGFyZV9tZWFucyhIREFDOV9tYXgxMDAgfiBQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCwgZ3JvdXAuYnkgPSAiR2VuZGVyIiwgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCnA2IDwtIGdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSwgCiAgICAgICAgICAgICAgICAgIHggPSAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5X21heDEwMCIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIlBsYXF1ZSB2dWxuZXJhYmlsaXR5IGluZGV4IiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKVxuIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBmYWNldC5ieSA9ICJPUnllYXJHcm91cCIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IEdlbmRlciksIGxhYmVsID0gInAuZm9ybWF0IiwgIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3BhcihwNiwgbGVnZW5kID0gImJvdHRvbSIsIGxlZ2VuZC50aXRsZSA9ICJQbGFxdWUgdnVsbmVyYWJpbGl0eSBpbmRleCIpCmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi4iLFRSQUlUX09GX0lOVEVSRVNULCIubWF4MTAwLnBsYXF1ZS5QbGFxdWVWdWxuZXJhYmlsaXR5SW5kZXhfRmFjZXRfYnlZZWFyLmJ5R2VuZGVyLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCmBgYAoKCiMjIyBNb2RlbCAxCgpJbiB0aGlzIG1vZGVsIHdlIGNvcnJlY3QgZm9yIF9BZ2VfLCBfR2VuZGVyXywgYW5kIF95ZWFyIG9mIHN1cmdlcnlfLgoKSGVyZSB3ZSB1c2UgdGhlIGludmVyc2UtcmFuayBub3JtYWxpemVkIGRhdGEgLSB2aXN1YWxseSB0aGlzIGlzIG1vcmUgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuCgpBbmFseXNpcyBvZiB0aGUgcGxhcXVlIHZ1bG5lcmFiaWxpdHkgaW5kZXogYXMgYSBmdW5jdGlvbiBvZiBwbGFxdWUgdGFyZ2V0KHMpIGxldmVscy4KCmBgYHtyIENyb3NzU2VjOiBQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCAtIG9yZGluYWwgcmVncmVzc2lvbiBNT0RFTDEgUkFOSywgcGFnZWQucHJpbnQ9VFJVRX0KVFJBSVRTLlRBUkdFVC5SQU5LLmV4dHJhID0gYygiSERBQzkiKQoKR0xNLnJlc3VsdHMgPC0gZGF0YS5mcmFtZShtYXRyaXgoTkEsIG5jb2wgPSAxNiwgbnJvdyA9IDApKQpmb3IgKHByb3RlaW4gaW4gMTpsZW5ndGgoVFJBSVRTLlRBUkdFVC5SQU5LLmV4dHJhKSkgewogIFBST1RFSU4gPSBUUkFJVFMuVEFSR0VULlJBTksuZXh0cmFbcHJvdGVpbl0KICBjYXQocGFzdGUwKCJcbkFuYWx5c2lzIG9mICIsUFJPVEVJTiwiLlxuIikpCiAgVFJBSVQgPSAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiCiAgICBjYXQocGFzdGUwKCJcbi0gcHJvY2Vzc2luZyAiLFRSQUlULCJcblxuIikpCiAgICBjdXJyZW50REYgPC0gYXMuZGF0YS5mcmFtZShBRVJOQVNFLmNsaW4uaGRhYzkgJT4lCiAgICAgIGRwbHlyOjpzZWxlY3QoLiwgUFJPVEVJTiwgVFJBSVQsIENPVkFSSUFURVNfTTEpICU+JQogICAgICBmaWx0ZXIoY29tcGxldGUuY2FzZXMoLikpKSAlPiUKICAgICAgZmlsdGVyX2lmKH5pcy5udW1lcmljKC4pLCBhbGxfdmFycyghaXMuaW5maW5pdGUoLikpKSAlPiUKICAgICAgZHJvcGxldmVscyguKQogICAgCiAgICAjIGZpeCBudW1lcmljIE9SIHllYXIKICAgICMgY3VycmVudERGJE9SZGF0ZV95ZWFyIDwtIGFzLm51bWVyaWMoY3VycmVudERGJE9SZGF0ZV95ZWFyKQogICAgCiAgICAjIGZvciBkZWJ1ZwogICAgIyBwcmludChEVDo6ZGF0YXRhYmxlKGN1cnJlbnRERikpCiAgICAjIHByaW50KG5yb3coY3VycmVudERGKSkKICAgICMgcHJpbnQoc3RyKGN1cnJlbnRERikpCiAgICAjIHByaW50KGNsYXNzKGN1cnJlbnRERlssVFJBSVRdKSkKICAgICMgdGFibGUoY3VycmVudERGJE9SZGF0ZV95ZWFyKQogICAgIyMjIHVuaXZhcmlhdGUKICAgICAjICsgSHlwZXJ0ZW5zaW9uLmNvbXBvc2l0ZSArIERpYWJldGVzU3RhdHVzICsgU21va2VyQ3VycmVudCArIAogICAgICMgICAgICAgICAgICBNZWQuU3RhdGluLkxMRCArIE1lZC5hbGwuYW50aXBsYXRlbGV0ICsgR0ZSX01EUkQgKyBCTUkgKyAKICAgICAjICAgICAgICAgICAgQ0FEX2hpc3RvcnkgKyBTdHJva2VfaGlzdG9yeSArIFBlcmlwaGVyYWwuaW50ZXJ2ICsgc3Rlbm9zZQogICAgIyBmaXQgPC0gcG9scihjdXJyZW50REZbLFRSQUlUXSB+IGN1cnJlbnRERlssUFJPVEVJTl0gKyBBZ2UgKyBHZW5kZXIgKyBPUmRhdGVfeWVhciwgCiAgICAjICAgICAgICAgICBkYXRhICA9ICBjdXJyZW50REYsIAogICAgIyAgICAgICAgICAgSGVzcyA9IFRSVUUpCiAgICBmaXQgPC0gcG9scihjdXJyZW50REZbLFRSQUlUXSB+IGN1cnJlbnRERlssUFJPVEVJTl0gKyBBZ2UgKyBHZW5kZXIgKyBPUmRhdGVfZXBvY2gsIAogICAgICAgICAgICAgIGRhdGEgID0gIGN1cnJlbnRERiwgCiAgICAgICAgICAgICAgSGVzcyA9IFRSVUUpCiAgICBwcmludChzdW1tYXJ5KGZpdCkpCiAgICAKICAgICMjIHN0b3JlIHRhYmxlCiAgICAoY3RhYmxlIDwtIGNvZWYoc3VtbWFyeShmaXQpKSkKCiAgICAjIyBjYWxjdWxhdGUgYW5kIHN0b3JlIHAgdmFsdWVzCiAgICBwIDwtIHBub3JtKGFicyhjdGFibGVbLCAidCB2YWx1ZSJdKSwgbG93ZXIudGFpbCA9IEZBTFNFKSAqIDIKICAgIAogICAgIyMgY29tYmluZWQgdGFibGUKICAgIHByaW50KChjdGFibGUgPC0gY2JpbmQoY3RhYmxlLCAicCB2YWx1ZSIgPSBwKSkpCiAgfQoKCmBgYAoKIyMjIE1vZGVsIDIKCkluIHRoaXMgbW9kZWwgd2UgY29ycmVjdCBmb3IgX0FnZV8sIF9HZW5kZXJfLCBfSHlwZXJ0ZW5zaW9uIHN0YXR1c18sIF9EaWFiZXRlcyBzdGF0dXNfLCBfY3VycmVudCBzbW9rZXIgc3RhdHVzXywgX2xpcGlkLWxvd2VyaW5nIGRydWdzIChMTERzKV8sIF9hbnRpcGxhdGVsZXQgbWVkaWNhdGlvbl8sIF9lR0ZSIChNRFJEKV8sIF9CTUlfLCBfTWVkSHhfQ1ZEXyAoY29tYmluYXRpb24gb2YgX0NBRCBoaXN0b3J5XywgX3N0cm9rZSBoaXN0b3J5XywgYW5kIF9wZXJpcGhlcmFsIGludGVydmVudGlvbnNfKSwgYW5kIF9zdGVub3Npcy5fLgoKCmBgYHtyIENyb3NzU2VjOiBQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCAtIG9yZGluYWwgcmVncmVzc2lvbiBNT0RFTDIgUkFOSywgcGFnZWQucHJpbnQ9VFJVRX0KCmZvciAocHJvdGVpbiBpbiAxOmxlbmd0aChUUkFJVFMuVEFSR0VULlJBTksuZXh0cmEpKSB7CiAgUFJPVEVJTiA9IFRSQUlUUy5UQVJHRVQuUkFOSy5leHRyYVtwcm90ZWluXQogIGNhdChwYXN0ZTAoIlxuQW5hbHlzaXMgb2YgIixQUk9URUlOLCIuXG4iKSkKICBUUkFJVCA9ICJQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCIKICAgIGNhdChwYXN0ZTAoIlxuLSBwcm9jZXNzaW5nICIsVFJBSVQsIlxuXG4iKSkKICAgIGN1cnJlbnRERiA8LSBhcy5kYXRhLmZyYW1lKEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUKICAgICAgZHBseXI6OnNlbGVjdCguLCBQUk9URUlOLCBUUkFJVCwgQ09WQVJJQVRFU19NMikgJT4lCiAgICAgIGZpbHRlcihjb21wbGV0ZS5jYXNlcyguKSkpICU+JQogICAgICBmaWx0ZXJfaWYofmlzLm51bWVyaWMoLiksIGFsbF92YXJzKCFpcy5pbmZpbml0ZSguKSkpICU+JQogICAgICBkcm9wbGV2ZWxzKC4pCiAgICAKICAgICMgZml4IG51bWVyaWMgT1IgeWVhcgogICAgIyBjdXJyZW50REYkT1JkYXRlX3llYXIgPC0gYXMubnVtZXJpYyhjdXJyZW50REYkT1JkYXRlX3llYXIpCiAgICAKICAgICMgZm9yIGRlYnVnCiAgICAjIHByaW50KERUOjpkYXRhdGFibGUoY3VycmVudERGKSkKICAgICMgcHJpbnQobnJvdyhjdXJyZW50REYpKQogICAgIyBwcmludChzdHIoY3VycmVudERGKSkKICAgICMgcHJpbnQoY2xhc3MoY3VycmVudERGWyxUUkFJVF0pKQogICAgIyMjIHVuaXZhcmlhdGUKCiAgICAjIGZpdCA8LSBwb2xyKGFzLmZhY3RvcihjdXJyZW50REZbLFRSQUlUXSkgfiBjdXJyZW50REZbLFBST1RFSU5dICsgQWdlICsgR2VuZGVyICsgT1JkYXRlX3llYXIgKyBIeXBlcnRlbnNpb24uY29tcG9zaXRlICsgRGlhYmV0ZXNTdGF0dXMgKyBTbW9rZXJTdGF0dXMgKyBNZWQuU3RhdGluLkxMRCArIE1lZC5hbGwuYW50aXBsYXRlbGV0ICsgR0ZSX01EUkQgKyBCTUkgKyBNZWRIeF9DVkQgKyBzdGVub3NlLAogICAgIyAgICAgICAgICAgZGF0YSAgPSAgY3VycmVudERGLAogICAgIyAgICAgICAgICAgSGVzcyA9IFRSVUUpCiAgICAKICAgIGZpdCA8LSBwb2xyKGFzLmZhY3RvcihjdXJyZW50REZbLFRSQUlUXSkgfiBjdXJyZW50REZbLFBST1RFSU5dICsgQWdlICsgR2VuZGVyICsgT1JkYXRlX2Vwb2NoICsgSHlwZXJ0ZW5zaW9uLmNvbXBvc2l0ZSArIERpYWJldGVzU3RhdHVzICsgU21va2VyU3RhdHVzICsgTWVkLlN0YXRpbi5MTEQgKyBNZWQuYWxsLmFudGlwbGF0ZWxldCArIEdGUl9NRFJEICsgQk1JICsgTWVkSHhfQ1ZEICsgc3Rlbm9zZSwKICAgICAgICAgICAgICBkYXRhICA9ICBjdXJyZW50REYsCiAgICAgICAgICAgICAgSGVzcyA9IFRSVUUpCiAgICAKICAgIHByaW50KHN1bW1hcnkoZml0KSkKICAgIAogICAgIyMgc3RvcmUgdGFibGUKICAgIChjdGFibGUgPC0gY29lZihzdW1tYXJ5KGZpdCkpKQoKICAgICMjIGNhbGN1bGF0ZSBhbmQgc3RvcmUgcCB2YWx1ZXMKICAgIHAgPC0gcG5vcm0oYWJzKGN0YWJsZVssICJ0IHZhbHVlIl0pLCBsb3dlci50YWlsID0gRkFMU0UpICogMgogICAgCiAgICAjIyBjb21iaW5lZCB0YWJsZQogICAgcHJpbnQoKGN0YWJsZSA8LSBjYmluZChjdGFibGUsICJwIHZhbHVlIiA9IHApKSkKICB9CgpgYGAKCiMjIyBTYXZpbmcgZGF0YSBmb3Igc2hhcmUKCldlIGFsc28gd2FudCB0byBzaGFyZSB0aGUgZGF0YSB3aXRoIG91ciBjb2xsYWJvcmF0b3JzLiBBbmQgcHJvdmlkZSBzb21lIG1vcmUgZ3JhcGhzIGFuZCBzdW1tYXJ5IHN0YXRpc3RpY3MgdG9vLgoKYGBge3J9CnN1bW1hcnkoQUVSTkFTRS5jbGluLmhkYWM5JEhEQUM5KQpgYGAKCgpgYGB7cn0KZ2dwdWJyOjpnZ2hpc3RvZ3JhbShBRVJOQVNFLmNsaW4uaGRhYzksIHggPSAiSERBQzkiLAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBhZGQgPSAibWVhbiIsIGFkZF9kZW5zaXR5ID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIpCmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi4iLFRSQUlUX09GX0lOVEVSRVNULCIucGxhcXVlLkhpc3RvZ3JhbS5ieUdlbmRlci5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKZ2dwdWJyOjpnZ2hpc3RvZ3JhbShBRVJOQVNFLmNsaW4uaGRhYzksIHggPSAiSERBQzkiLAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIlBsYXF1ZV9WdWxuZXJhYmlsaXR5X0luZGV4IiwgZmlsbCA9ICJQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCIsCiAgICAgICAgICAgICAgICAgICAgZmFjZXQuYnkgPSAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiLAogICAgICAgICAgICAgICAgICAgIGFkZCA9ICJtZWFuIiwgYWRkX2RlbnNpdHkgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAibnBnIikKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5wbGFxdWUuSGlzdG9ncmFtLkZhY2V0YnlQVkkucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmdncHVicjo6Z2doaXN0b2dyYW0oQUVSTkFTRS5jbGluLmhkYWM5LCB4ID0gIkhEQUM5IiwKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCIsIGZpbGwgPSAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiLAogICAgICAgICAgICAgICAgICAgICMgZmFjZXQuYnkgPSAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiLAogICAgICAgICAgICAgICAgICAgIGFkZCA9ICJtZWFuIiwgYWRkX2RlbnNpdHkgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAibnBnIikKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5wbGFxdWUuSGlzdG9ncmFtLmJ5UFZJLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgoKZ2dwdWJyOjpnZ2hpc3RvZ3JhbShBRVJOQVNFLmNsaW4uaGRhYzksIHggPSAiSERBQzkiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCBydWcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgIGFkZCA9ICJtZWFuIiwgYWRkX2RlbnNpdHkgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbikiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAibnBnIikKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5wbGFxdWUuSGlzdG9ncmFtLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgpgYGAKCmBgYHtyfQpBRVJOQVNFLmNsaW4uaGRhYzkuZm9yU0hBUkUgPC0gc3Vic2V0KEFFUk5BU0UuY2xpbi5oZGFjOSwgc2VsZWN0ID0gYygiU1RVRFlfTlVNQkVSIiwgIkFnZSIsICJHZW5kZXIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhEQUM5IiwgIkhEQUM5X21heDEwMCIsICJQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCIpKQpgYGAKCgpgYGB7cn0Kc2F2ZVJEUyhBRVJOQVNFLmNsaW4uaGRhYzkuZm9yU0hBUkUsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLCBUb2RheSwgIi4iLFRSQUlUX09GX0lOVEVSRVNULCIuQUVSTkFTRS5jbGluLmhkYWM5LmZvclNIQVJFLnJkcyIpKQoKZndyaXRlKEFFUk5BU0UuY2xpbi5oZGFjOS5mb3JTSEFSRSwgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsIFRvZGF5LCAiLiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5BRVJOQVNFLmNsaW4uaGRhYzkuZm9yU0hBUkUudHh0IiksCiAgICAgICBzZXAgPSAiXHQiLAogICAgICAgcXVvdGUgPSBGQUxTRSwKICAgICAgIG5hID0gIk5BIiwgCiAgICAgICB2ZXJib3NlID0gVFJVRSwgc2hvd1Byb2dyZXNzID0gVFJVRSwgblRocmVhZCA9IDgpCmBgYAoKCiMjIFBsb3R0aW5nIEhEQUM5IHZzIEZhdCAxMCBwZXJjLiBpbiB0aGUgcGxhcXVlCgpgYGB7cn0KIyBHbG9iYWwgdGVzdApjb21wYXJlX21lYW5zKEhEQUM5IH4gRmF0LmJpbl8xMCwgIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoRmF0LmJpbl8xMCkpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKcDEgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKEZhdC5iaW5fMTApKSwgCiAgICAgICAgICAgICAgICAgIHggPSAiRmF0LmJpbl8xMCIsCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzkiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJGYXQgPDEwJSB2cyA+MTAlIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKVxuIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiRmF0LmJpbl8xMCIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAibnBnIiwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwgPSAicC5mb3JtYXQiLCAgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncGFyKHAxLCBsZWdlbmQgPSAiYm90dG9tIiwgbGVnZW5kLnRpdGxlID0gIkZhdCA8MTAlIHZzID4xMCUiKQpnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuIixUUkFJVF9PRl9JTlRFUkVTVCwiLnBsYXF1ZS5GYXQuYmluXzEwLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCmBgYAoKYGBge3J9CmNvbXBhcmVfbWVhbnMoSERBQzkgfiBGYXQuYmluXzEwLCBncm91cC5ieSA9ICJHZW5kZXIiLCBkYXRhID0gQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKEZhdC5iaW5fMTApKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCnAyIDwtIGdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShGYXQuYmluXzEwKSksIAogICAgICAgICAgICAgICAgICB4ID0gIkZhdC5iaW5fMTAiLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5IiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiRmF0IDwxMCUgdnMgPjEwJSBieSBnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pXG4iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IEdlbmRlciksIGxhYmVsID0gInAuZm9ybWF0IiwgIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3BhcihwMiwgbGVnZW5kID0gImJvdHRvbSIsIGxlZ2VuZC50aXRsZSA9ICJGYXQgPDEwJSB2cyA+MTAlIGJ5IGdlbmRlciIpCmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi4iLFRSQUlUX09GX0lOVEVSRVNULCIucGxhcXVlLkZhdC5iaW5fMTAuYnlHZW5kZXIucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmBgYAoKYGBge3J9CmNvbXBhcmVfbWVhbnMoSERBQzkgfiBGYXQuYmluXzEwLCBkYXRhID0gQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKEZhdC5iaW5fMTApKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCnA1IDwtIGdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShGYXQuYmluXzEwKSksIAogICAgICAgICAgICAgICAgICB4ID0gIkZhdC5iaW5fMTAiLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5IiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiRmF0IDwxMCUgdnMgPjEwJSBieSB5ZWFyIG9mIHN1cmdlcnkiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pXG4iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJGYXQuYmluXzEwIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJucGciLAogICAgICAgICAgICAgICAgICBmYWNldC5ieSA9ICJPUnllYXJHcm91cCIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGxhYmVsID0gInAuZm9ybWF0IiwgIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3BhcihwNSwgbGVnZW5kID0gImJvdHRvbSIsIGxlZ2VuZC50aXRsZSA9ICJGYXQgPDEwJSB2cyA+MTAlIGJ5IHllYXIgb2Ygc3VyZ2VyeSIpCmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi4iLFRSQUlUX09GX0lOVEVSRVNULCIucGxhcXVlLkZhdC5iaW5fMTBfRmFjZXRfYnlZZWFyLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCmBgYAoKYGBge3J9CmNvbXBhcmVfbWVhbnMoSERBQzkgfiBGYXQuYmluXzEwLCBncm91cC5ieSA9ICJHZW5kZXIiLCBkYXRhID0gQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKEZhdC5iaW5fMTApKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCnA2IDwtIGdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShGYXQuYmluXzEwKSksIAogICAgICAgICAgICAgICAgICB4ID0gIkZhdC5iaW5fMTAiLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5IiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiRmF0IDwxMCUgdnMgPjEwJSBieSB5ZWFyIG9mIHN1cmdlcnkgYW5kIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbilcbiIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgZmFjZXQuYnkgPSAiT1J5ZWFyR3JvdXAiLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhhZXMoZ3JvdXAgPSBHZW5kZXIpLCBsYWJlbCA9ICJwLmZvcm1hdCIsICBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwYXIocDYsIGxlZ2VuZCA9ICJib3R0b20iLCBsZWdlbmQudGl0bGUgPSAiRmF0IDwxMCUgdnMgPjEwJSBieSB5ZWFyIG9mIHN1cmdlcnkgYW5kIGdlbmRlciIpCmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi4iLFRSQUlUX09GX0lOVEVSRVNULCIucGxhcXVlLkZhdC5iaW5fMTBfRmFjZXRfYnlZZWFyLmJ5R2VuZGVyLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCmBgYAoKYGBge3J9CmNvbXBhcmVfbWVhbnMoSERBQzlfbWF4MTAwIH4gRmF0LmJpbl8xMCwgIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoRmF0LmJpbl8xMCkpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKcDEgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKEZhdC5iaW5fMTApKSwgCiAgICAgICAgICAgICAgICAgIHggPSAiRmF0LmJpbl8xMCIsCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzlfbWF4MTAwIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiRmF0IDwxMCUgdnMgPjEwJSIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbilcbiIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkZhdC5iaW5fMTAiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGxhYmVsID0gInAuZm9ybWF0IiwgIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3BhcihwMSwgbGVnZW5kID0gImJvdHRvbSIsIGxlZ2VuZC50aXRsZSA9ICJGYXQgPDEwJSB2cyA+MTAlIikKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5tYXgxMDAucGxhcXVlLkZhdC5iaW5fMTAucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKYGBgCgoKIyMgUGxvdHRpbmcgSERBQzkgdnMgRmF0IDQwIHBlcmMuIGluIHRoZSBwbGFxdWUKCmBgYHtyfQojIEdsb2JhbCB0ZXN0CmNvbXBhcmVfbWVhbnMoSERBQzkgfiBGYXQuYmluXzQwLCAgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShGYXQuYmluXzQwKSksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpwMSA8LSBnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoRmF0LmJpbl80MCkpLCAKICAgICAgICAgICAgICAgICAgeCA9ICJGYXQuYmluXzQwIiwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkZhdCA8NDAlIHZzID40MCUiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pXG4iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJGYXQuYmluXzQwIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJucGciLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhsYWJlbCA9ICJwLmZvcm1hdCIsICBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwYXIocDEsIGxlZ2VuZCA9ICJib3R0b20iLCBsZWdlbmQudGl0bGUgPSAiRmF0IDw0MCUgdnMgPjQwJSIpCmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi4iLFRSQUlUX09GX0lOVEVSRVNULCIucGxhcXVlLkZhdC5iaW5fNDAucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKYGBgCgpgYGB7cn0KY29tcGFyZV9tZWFucyhIREFDOSB+IEZhdC5iaW5fNDAsIGdyb3VwLmJ5ID0gIkdlbmRlciIsIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoRmF0LmJpbl80MCkpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKcDIgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKEZhdC5iaW5fNDApKSwgCiAgICAgICAgICAgICAgICAgIHggPSAiRmF0LmJpbl80MCIsCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzkiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJGYXQgPDQwJSB2cyA+NDAlIGJ5IGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbilcbiIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoYWVzKGdyb3VwID0gR2VuZGVyKSwgbGFiZWwgPSAicC5mb3JtYXQiLCAgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncGFyKHAyLCBsZWdlbmQgPSAiYm90dG9tIiwgbGVnZW5kLnRpdGxlID0gIkZhdCA8NDAlIHZzID40MCUgYnkgZ2VuZGVyIikKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5wbGFxdWUuRmF0LmJpbl80MC5ieUdlbmRlci5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKYGBgCgpgYGB7cn0KY29tcGFyZV9tZWFucyhIREFDOSB+IEZhdC5iaW5fNDAsIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoRmF0LmJpbl80MCkpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKcDUgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKEZhdC5iaW5fNDApKSwgCiAgICAgICAgICAgICAgICAgIHggPSAiRmF0LmJpbl80MCIsCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzkiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJGYXQgPDQwJSB2cyA+NDAlIGJ5IHllYXIgb2Ygc3VyZ2VyeSIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbilcbiIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkZhdC5iaW5fNDAiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGZhY2V0LmJ5ID0gIk9SeWVhckdyb3VwIiwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwgPSAicC5mb3JtYXQiLCAgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncGFyKHA1LCBsZWdlbmQgPSAiYm90dG9tIiwgbGVnZW5kLnRpdGxlID0gIkZhdCA8NDAlIHZzID40MCUgYnkgeWVhciBvZiBzdXJnZXJ5IikKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5wbGFxdWUuRmF0LmJpbl80MF9GYWNldF9ieVllYXIucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKYGBgCgpgYGB7cn0KY29tcGFyZV9tZWFucyhIREFDOSB+IEZhdC5iaW5fNDAsIGdyb3VwLmJ5ID0gIkdlbmRlciIsIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoRmF0LmJpbl80MCkpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKcDYgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKEZhdC5iaW5fNDApKSwgCiAgICAgICAgICAgICAgICAgIHggPSAiRmF0LmJpbl80MCIsCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzkiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJGYXQgPDQwJSB2cyA+NDAlIGJ5IHllYXIgb2Ygc3VyZ2VyeSBhbmQgZ2VuZGVyIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKVxuIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBmYWNldC5ieSA9ICJPUnllYXJHcm91cCIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IEdlbmRlciksIGxhYmVsID0gInAuZm9ybWF0IiwgIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3BhcihwNiwgbGVnZW5kID0gImJvdHRvbSIsIGxlZ2VuZC50aXRsZSA9ICJGYXQgPDQwJSB2cyA+NDAlIGJ5IHllYXIgb2Ygc3VyZ2VyeSBhbmQgZ2VuZGVyIikKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5wbGFxdWUuRmF0LmJpbl80MF9GYWNldF9ieVllYXIuYnlHZW5kZXIucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKYGBgCgpgYGB7cn0KIyBHbG9iYWwgdGVzdApjb21wYXJlX21lYW5zKEhEQUM5X21heDEwMCB+IEZhdC5iaW5fNDAsICBkYXRhID0gQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKEZhdC5iaW5fNDApKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCnAxIDwtIGdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShGYXQuYmluXzQwKSksIAogICAgICAgICAgICAgICAgICB4ID0gIkZhdC5iaW5fNDAiLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5X21heDEwMCIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkZhdCA8NDAlIHZzID40MCUiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pXG4iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJGYXQuYmluXzQwIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJucGciLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhsYWJlbCA9ICJwLmZvcm1hdCIsICBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwYXIocDEsIGxlZ2VuZCA9ICJib3R0b20iLCBsZWdlbmQudGl0bGUgPSAiRmF0IDw0MCUgdnMgPjQwJSIpCmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi4iLFRSQUlUX09GX0lOVEVSRVNULCIubWF4MTAwLnBsYXF1ZS5GYXQuYmluXzQwLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCmBgYAoKCgojIyBQbG90dGluZyBIREFDOSB2cyBJUEggaW4gdGhlIHBsYXF1ZQoKYGBge3J9CiMgR2xvYmFsIHRlc3QKY29tcGFyZV9tZWFucyhIREFDOSB+IElQSC5iaW4sICBkYXRhID0gQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKElQSC5iaW4pKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCnAxIDwtIGdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShJUEguYmluKSksIAogICAgICAgICAgICAgICAgICB4ID0gIklQSC5iaW4iLAogICAgICAgICAgICAgICAgICB5ID0gIkhEQUM5IiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiSW50cmFwbGFxdWUgaGVtb3JyaGFnZSAobm8gdnMuIHllcykiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pXG4iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJJUEguYmluIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJucGciLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhsYWJlbCA9ICJwLmZvcm1hdCIsICBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwYXIocDEsIGxlZ2VuZCA9ICJib3R0b20iLCBsZWdlbmQudGl0bGUgPSAiSVBIIikKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5wbGFxdWUuSVBILmJpbi5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQpgYGAKCmBgYHtyfQpjb21wYXJlX21lYW5zKEhEQUM5IH4gSVBILmJpbiwgZ3JvdXAuYnkgPSAiR2VuZGVyIiwgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShJUEguYmluKSksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpwMiA8LSBnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoSVBILmJpbikpLCAKICAgICAgICAgICAgICAgICAgeCA9ICJJUEguYmluIiwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkludHJhcGxhcXVlIGhlbW9ycmhhZ2UgKG5vIHZzLiB5ZXMpIGJ5IGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbilcbiIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoYWVzKGdyb3VwID0gR2VuZGVyKSwgbGFiZWwgPSAicC5mb3JtYXQiLCAgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncGFyKHAyLCBsZWdlbmQgPSAiYm90dG9tIiwgbGVnZW5kLnRpdGxlID0gIklQSCBieSBnZW5kZXIiKQpnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuIixUUkFJVF9PRl9JTlRFUkVTVCwiLnBsYXF1ZS5JUEguYmluLmJ5R2VuZGVyLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgpgYGAKCmBgYHtyfQpjb21wYXJlX21lYW5zKEhEQUM5IH4gSVBILmJpbiwgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShJUEguYmluKSksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpwNSA8LSBnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoSVBILmJpbikpLCAKICAgICAgICAgICAgICAgICAgeCA9ICJJUEguYmluIiwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkludHJhcGxhcXVlIGhlbW9ycmhhZ2UgKG5vIHZzLiB5ZXMpIGJ5IHllYXIgb2Ygc3VyZ2VyeSIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbilcbiIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIklQSC5iaW4iLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGZhY2V0LmJ5ID0gIk9SeWVhckdyb3VwIiwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwgPSAicC5mb3JtYXQiLCAgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncGFyKHA1LCBsZWdlbmQgPSAiYm90dG9tIiwgbGVnZW5kLnRpdGxlID0gIklQSCBieSB5ZWFyIG9mIHN1cmdlcnkiKQpnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuIixUUkFJVF9PRl9JTlRFUkVTVCwiLnBsYXF1ZS5JUEguYmluX0ZhY2V0X2J5WWVhci5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQpgYGAKCmBgYHtyfQpjb21wYXJlX21lYW5zKEhEQUM5IH4gSVBILmJpbiwgZ3JvdXAuYnkgPSAiR2VuZGVyIiwgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShJUEguYmluKSksIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpwNiA8LSBnZ3B1YnI6OmdnYm94cGxvdChBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoSVBILmJpbikpLCAKICAgICAgICAgICAgICAgICAgeCA9ICJJUEguYmluIiwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkludHJhcGxhcXVlIGhlbW9ycmhhZ2UgKG5vIHZzLiB5ZXMpIGJ5IHllYXIgb2Ygc3VyZ2VyeSBhbmQgZ2VuZGVyIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKVxuIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBmYWNldC5ieSA9ICJPUnllYXJHcm91cCIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IEdlbmRlciksIGxhYmVsID0gInAuZm9ybWF0IiwgIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3BhcihwNiwgbGVnZW5kID0gImJvdHRvbSIsIGxlZ2VuZC50aXRsZSA9ICJJUEggYnkgeWVhciBvZiBzdXJnZXJ5IGFuZCBnZW5kZXIiKQpnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuIixUUkFJVF9PRl9JTlRFUkVTVCwiLnBsYXF1ZS5JUEguYmluX0ZhY2V0X2J5WWVhci5ieUdlbmRlci5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQpgYGAKCmBgYHtyfQojIEdsb2JhbCB0ZXN0CmNvbXBhcmVfbWVhbnMoSERBQzlfbWF4MTAwIH4gSVBILmJpbiwgIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoSVBILmJpbikpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKcDEgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKElQSC5iaW4pKSwgCiAgICAgICAgICAgICAgICAgIHggPSAiSVBILmJpbiIsCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzlfbWF4MTAwIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiSW50cmFwbGFxdWUgaGVtb3JyaGFnZSAobm8gdnMuIHllcykiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pXG4iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJJUEguYmluIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJucGciLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhsYWJlbCA9ICJwLmZvcm1hdCIsICBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwYXIocDEsIGxlZ2VuZCA9ICJib3R0b20iLCBsZWdlbmQudGl0bGUgPSAiSVBIIikKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5tYXgxMDAucGxhcXVlLklQSC5iaW4ucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKYGBgCgoKCiMjIFBsb3R0aW5nIEhEQUM5IHZzIENhbGNpZmljYXRpb24gaW4gdGhlIHBsYXF1ZQoKYGBge3J9CiMgR2xvYmFsIHRlc3QKY29tcGFyZV9tZWFucyhIREFDOSB+IENhbGMuYmluLCAgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShDYWxjLmJpbikpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKcDEgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKENhbGMuYmluKSksIAogICAgICAgICAgICAgICAgICB4ID0gIkNhbGMuYmluIiwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkNhbGNpZmljYXRpb24gKG5vL21pbm9yIHZzLiBtb2RlcmF0ZS9oZWF2eSkiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pXG4iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJDYWxjLmJpbiIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAibnBnIiwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwgPSAicC5mb3JtYXQiLCAgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncGFyKHAxLCBsZWdlbmQgPSAiYm90dG9tIiwgbGVnZW5kLnRpdGxlID0gIkNhbGNpZmljYXRpb24iKQpnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuIixUUkFJVF9PRl9JTlRFUkVTVCwiLnBsYXF1ZS5DYWxjLmJpbi5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQpgYGAKCmBgYHtyfQpjb21wYXJlX21lYW5zKEhEQUM5IH4gQ2FsYy5iaW4sIGdyb3VwLmJ5ID0gIkdlbmRlciIsIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoQ2FsYy5iaW4pKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCnAyIDwtIGdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShDYWxjLmJpbikpLCAKICAgICAgICAgICAgICAgICAgeCA9ICJDYWxjLmJpbiIsCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzkiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJDYWxjaWZpY2F0aW9uIChuby9taW5vciB2cy4gbW9kZXJhdGUvaGVhdnkpIGJ5IGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbilcbiIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoYWVzKGdyb3VwID0gR2VuZGVyKSwgbGFiZWwgPSAicC5mb3JtYXQiLCAgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncGFyKHAyLCBsZWdlbmQgPSAiYm90dG9tIiwgbGVnZW5kLnRpdGxlID0gIkNhbGNpZmljYXRpb24gYnkgZ2VuZGVyIikKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5wbGFxdWUuQ2FsYy5iaW4uYnlHZW5kZXIucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmBgYAoKYGBge3J9CmNvbXBhcmVfbWVhbnMoSERBQzkgfiBDYWxjLmJpbiwgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShDYWxjLmJpbikpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKcDUgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKENhbGMuYmluKSksIAogICAgICAgICAgICAgICAgICB4ID0gIkNhbGMuYmluIiwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkNhbGNpZmljYXRpb24gKG5vL21pbm9yIHZzLiBtb2RlcmF0ZS9oZWF2eSkgYnkgeWVhciBvZiBzdXJnZXJ5IiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJIREFDOSAobm9ybWFsaXplZCBleHByZXNzaW9uKVxuIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiQ2FsYy5iaW4iLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGZhY2V0LmJ5ID0gIk9SeWVhckdyb3VwIiwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwgPSAicC5mb3JtYXQiLCAgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncGFyKHA1LCBsZWdlbmQgPSAiYm90dG9tIiwgbGVnZW5kLnRpdGxlID0gIkNhbGNpZmljYXRpb24gYnkgeWVhciBvZiBzdXJnZXJ5IikKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLiIsVFJBSVRfT0ZfSU5URVJFU1QsIi5wbGFxdWUuQ2FsYy5iaW5fRmFjZXRfYnlZZWFyLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCmBgYAoKYGBge3J9CmNvbXBhcmVfbWVhbnMoSERBQzkgfiBDYWxjLmJpbiwgZ3JvdXAuYnkgPSAiR2VuZGVyIiwgZGF0YSA9IEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShDYWxjLmJpbikpLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKcDYgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoQUVSTkFTRS5jbGluLmhkYWM5ICU+JSBmaWx0ZXIoIWlzLm5hKENhbGMuYmluKSksIAogICAgICAgICAgICAgICAgICB4ID0gIkNhbGMuYmluIiwKICAgICAgICAgICAgICAgICAgeSA9ICJIREFDOSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkNhbGNpZmljYXRpb24gKG5vL21pbm9yIHZzLiBtb2RlcmF0ZS9oZWF2eSkgYnkgeWVhciBvZiBzdXJnZXJ5IGFuZCBnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIkhEQUM5IChub3JtYWxpemVkIGV4cHJlc3Npb24pXG4iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGZhY2V0LmJ5ID0gIk9SeWVhckdyb3VwIiwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoYWVzKGdyb3VwID0gR2VuZGVyKSwgbGFiZWwgPSAicC5mb3JtYXQiLCAgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncGFyKHA2LCBsZWdlbmQgPSAiYm90dG9tIiwgbGVnZW5kLnRpdGxlID0gIkNhbGNpZmljYXRpb24gYnkgeWVhciBvZiBzdXJnZXJ5IGFuZCBnZW5kZXIiKQpnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuIixUUkFJVF9PRl9JTlRFUkVTVCwiLnBsYXF1ZS5DYWxjLmJpbl9GYWNldF9ieVllYXIuYnlHZW5kZXIucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKYGBgCgpgYGB7cn0KY29tcGFyZV9tZWFucyhIREFDOV9tYXgxMDAgfiBDYWxjLmJpbiwgIGRhdGEgPSBBRVJOQVNFLmNsaW4uaGRhYzkgJT4lIGZpbHRlcighaXMubmEoQ2FsYy5iaW4pKSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCnAxIDwtIGdncHVicjo6Z2dib3hwbG90KEFFUk5BU0UuY2xpbi5oZGFjOSAlPiUgZmlsdGVyKCFpcy5uYShDYWxjLmJpbikpLCAKICAgICAgICAgICAgICAgICAgeCA9ICJDYWxjLmJpbiIsCiAgICAgICAgICAgICAgICAgIHkgPSAiSERBQzlfbWF4MTAwIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiQ2FsY2lmaWNhdGlvbiAobm8vbWlub3IgdnMuIG1vZGVyYXRlL2hlYXZ5KSIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiSERBQzkgKG5vcm1hbGl6ZWQgZXhwcmVzc2lvbilcbiIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkNhbGMuYmluIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJucGciLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhsYWJlbCA9ICJwLmZvcm1hdCIsICBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwYXIocDEsIGxlZ2VuZCA9ICJib3R0b20iLCBsZWdlbmQudGl0bGUgPSAiQ2FsY2lmaWNhdGlvbiIpCmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi4iLFRSQUlUX09GX0lOVEVSRVNULCIubWF4MTAwLnBsYXF1ZS5DYWxjLmJpbi5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQpgYGAKCgojIFNlc3Npb24gaW5mb3JtYXRpb24KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgVmVyc2lvbjogICAgICB2MS4wLjYKICAgIExhc3QgdXBkYXRlOiAgMjAyMy0wNi0wNgogICAgV3JpdHRlbiBieTogICBTYW5kZXIgVy4gdmFuIGRlciBMYWFuIChzLncudmFuZGVybGFhbi0yW2F0XXVtY3V0cmVjaHQubmwpLgogICAgRGVzY3JpcHRpb246ICBTY3JpcHQgdG8gYW5hbHlzZSBIREFDOSBmcm9tIHRoZSBBdGhlci1FeHByZXNzIEJpb2JhbmsgU3R1ZHkuCiAgICBNaW5pbXVtIHJlcXVpcmVtZW50czogUiB2ZXJzaW9uIDMuNS4yICgyMDE4LTEyLTIwKSAtLSAnRWdnc2hlbGwgSWdsb28nLCBtYWNPUyBNb2phdmUgKDEwLjE0LjIpLgogICAgCiAgICAqKk1vU0NvVyBUby1EbyBMaXN0KioKICAgIFRoZSB0aGluZ3Mgd2UgTXVzdCwgU2hvdWxkLCBDb3VsZCwgYW5kIFdvdWxkIGhhdmUgZ2l2ZW4gdGhlIHRpbWUgd2UgaGF2ZS4KICAgIF9NXwoKICAgIF9TXwoKICAgIF9DXwoKICAgIF9XXwoKICAgICoqQ2hhbmdlcyBsb2cqKgogICAgKiB2MS4wLjYgQWRkZWQgbWF4aW11bSBjb3VudHMgdG8gSERBQzkgaW4gbWFueSBncmFwaHMuCiAgICAqIHYxLjAuNSBGaXhlZCBmb3Jlc3QgcGxvdCBhbmQgYWx0ZXJuYXRpdmUgYm94cGxvdCBmb3Igc3ltcHRvbXMuCiAgICAqIHYxLjAuNCBNYWRlIGhpc3RvZ3JhbSBvZiBQVkkuIEV4cG9ydGVkIEhEQUM5IGFuZCBQVkkgZGF0YS4KICAgICogdjEuMC4zIFNtYWxsIGFkYXB0YXRpb25zIHRvIFBWSS1wbG90cy4KICAgICogdjEuMC4yIENoYW5nZWQgdGhlIFBWSS1wbG90LgogICAgKiB2MS4wLjEgQWRkZWQgZmlndXJlcyBvbiBmYXQgaW4gdGhlIHBsYXF1ZS4KICAgICogdjEuMC4wIEluaXRhbCB2ZXJzaW9uLgogICAgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3IgZXZhbCA9IFRSVUV9CnNlc3Npb25JbmZvKCkKYGBgCgojIFNhdmluZyBlbnZpcm9ubWVudApgYGB7ciBTYXZpbmd9CnNhdmUuaW1hZ2UocGFzdGUwKFBST0pFQ1RfbG9jLCAiLyIsVG9kYXksIi4iLFBST0pFQ1ROQU1FLCIuYnVsa1JOQXNlcS5hZGRpdGlvbmFsX2ZpZ3VyZXMuUkRhdGEiKSkKYGBgCgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgPHN1cD7CqSAxOTc5LTIwMjMgU2FuZGVyIFcuIHZhbiBkZXIgTGFhbiB8IHMudy52YW5kZXJsYWFuW2F0XWdtYWlsLmNvbSB8IFt2YW5kZXJsYWFuLnNjaWVuY2VdKGh0dHBzOi8vdmFuZGVybGFhbi5zY2llbmNlKS48L3N1cD4gfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgoK